找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21878|回复: 9

[文本处理] [已解决]禁用RAID设备的批处理执行结果和实际有出入

[复制链接]
发表于 2023-8-22 14:22:29 | 显示全部楼层 |阅读模式
本帖最后由 yakeyun 于 2023-8-23 13:23 编辑

因为需要用这个命令来禁用RAID设备,如果不禁用自动打上驱动后会导致开机蓝屏。
先上代码:
  1. @echo off & setlocal enabledelayedexpansion
  2. cd /d "%~dp0"


  3. ::=============================优先禁用RAID设备=============================
  4. for /f "tokens=1,* delims=:" %%a in ('pnputil /enum-devices /problem 28 /ids ^|findstr /n "RAID 控制器"') do (
  5.    set lines=%%a
  6.    set /a lines1=!lines! - 1
  7.    echo !lines!
  8.    echo !lines1!
  9.    set counter=0
  10. for /f "tokens=1,*"  %%b in ('pnputil /enum-devices /problem 28 /ids') do (
  11.     set /a counter+=1
  12.     if !counter! equ !lines1! (
  13.         echo !counter!
  14.         echo %%b
  15.         start /min "" "%SystemRoot%\system32\pnputil.exe" /disable-device "%%c"
  16.        )
  17.     )
  18. )
  19. :Scan
  20. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
  21. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
  22. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
  23. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
  24. pause
  25. exit
复制代码
下面是运行结果,从运行结果可以看出,获取的变量都是对的,但是结果却是错的。
其中 if !counter! equ !lines1! 这句代码的作用是,如果当前操作的行号和目标行号一致,就输出内容。也就是"实例   ID:" 所在行信息。


评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-8-22 15:23:47 | 显示全部楼层
因为for跳过了空行。你为什么不直接findstr "实例 ID"呢
 楼主| 发表于 2023-8-22 17:09:05 | 显示全部楼层
本帖最后由 yakeyun 于 2023-8-22 17:21 编辑

回复 2# buyiyang


对于新系统来说,用这个28代码特征获取的条目比较多,一般都是3~5个左右,直接获取无法筛选:

Microsoft PnP 工具

实例 ID:                PCI\VEN_8086&DEV_7AA3&SUBSYS_86941043&REV_11\3&11583659&0&FC
设备描述:         SM 总线控制器
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_8086&DEV_7AA3&SUBSYS_86941043&REV_11
PCI\VEN_8086&DEV_7AA3&SUBSYS_86941043
PCI\VEN_8086&DEV_7AA3&CC_0C0500
PCI\VEN_8086&DEV_7AA3&CC_0C05
兼容 ID:             PCI\VEN_8086&DEV_7AA3&REV_11
PCI\VEN_8086&DEV_7AA3
PCI\VEN_8086&CC_0C0500
PCI\VEN_8086&CC_0C05
PCI\VEN_8086
PCI\CC_0C0500
PCI\CC_0C05

实例 ID:                PCI\VEN_10DE&DEV_1AED&SUBSYS_16407377&REV_A1\4&2e6f6d9a&0&0308
设备描述:         PCI 设备
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_10DE&DEV_1AED&SUBSYS_16407377&REV_A1
PCI\VEN_10DE&DEV_1AED&SUBSYS_16407377
PCI\VEN_10DE&DEV_1AED&CC_0C8000
PCI\VEN_10DE&DEV_1AED&CC_0C80
兼容 ID:             PCI\VEN_10DE&DEV_1AED&REV_A1
PCI\VEN_10DE&DEV_1AED
PCI\VEN_10DE&CC_0C8000
PCI\VEN_10DE&CC_0C80
PCI\VEN_10DE
PCI\CC_0C8000&DT_0
PCI\CC_0C8000
PCI\CC_0C80&DT_0
PCI\CC_0C80

实例 ID:                PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70
设备描述:         RAID 控制器
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00
PCI\VEN_8086&DEV_467F&SUBSYS_86941043
PCI\VEN_8086&DEV_467F&CC_010400
PCI\VEN_8086&DEV_467F&CC_0104
兼容 ID:             PCI\VEN_8086&DEV_467F&REV_00
PCI\VEN_8086&DEV_467F
PCI\VEN_8086&CC_010400
PCI\VEN_8086&CC_0104
PCI\VEN_8086
PCI\CC_010400&DT_9
PCI\CC_010400
PCI\CC_0104&DT_9
PCI\CC_0104

实例 ID:                PCI\VEN_8086&DEV_7AA4&SUBSYS_86941043&REV_11\3&11583659&0&FD
设备描述:         PCI 设备
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_8086&DEV_7AA4&SUBSYS_86941043&REV_11
PCI\VEN_8086&DEV_7AA4&SUBSYS_86941043
PCI\VEN_8086&DEV_7AA4&CC_0C8000
PCI\VEN_8086&DEV_7AA4&CC_0C80
兼容 ID:             PCI\VEN_8086&DEV_7AA4&REV_11
PCI\VEN_8086&DEV_7AA4
PCI\VEN_8086&CC_0C8000
PCI\VEN_8086&CC_0C80
PCI\VEN_8086
PCI\CC_0C8000
PCI\CC_0C80

实例 ID:                PCI\VEN_8086&DEV_7AE8&SUBSYS_86941043&REV_11\3&11583659&0&B0
设备描述:         PCI 简单通讯控制器
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_8086&DEV_7AE8&SUBSYS_86941043&REV_11
PCI\VEN_8086&DEV_7AE8&SUBSYS_86941043
PCI\VEN_8086&DEV_7AE8&CC_078000
PCI\VEN_8086&DEV_7AE8&CC_0780
兼容 ID:             PCI\VEN_8086&DEV_7AE8&REV_11
PCI\VEN_8086&DEV_7AE8
PCI\VEN_8086&CC_078000
PCI\VEN_8086&CC_0780
PCI\VEN_8086
PCI\CC_078000
PCI\CC_0780

实例 ID:                ACPI\INTC1056\2&daba3ff&0
设备描述:         未知
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               ACPI\VEN_INTC&DEV_1056
ACPI\INTC1056
*INTC1056

实例 ID:                PCI\VEN_8086&DEV_7ACC&SUBSYS_86941043&REV_11\3&11583659&0&A8
设备描述:         PCI 设备
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_8086&DEV_7ACC&SUBSYS_86941043&REV_11
PCI\VEN_8086&DEV_7ACC&SUBSYS_86941043
PCI\VEN_8086&DEV_7ACC&CC_0C8000
PCI\VEN_8086&DEV_7ACC&CC_0C80
兼容 ID:             PCI\VEN_8086&DEV_7ACC&REV_11
PCI\VEN_8086&DEV_7ACC
PCI\VEN_8086&CC_0C8000
PCI\VEN_8086&CC_0C80
PCI\VEN_8086
PCI\CC_0C8000
PCI\CC_0C80
发表于 2023-8-22 17:32:00 | 显示全部楼层
回复 3# yakeyun


    用兼容ID
 楼主| 发表于 2023-8-22 18:02:57 | 显示全部楼层
回复 4# buyiyang

现有的代码是直接用的收集的所有类型,但是想做一个通用的:
  1. :End
  2. start /min "" "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_88821043&REV_00\3&11583659&0&70"
  3. start /min "" "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  4. start /min "" "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  5. start /min "" "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_00008086&REV_00\3&11583659&0&70"
  6. start /min "" "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  7. start /min "" "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_88821043&REV_00\3&11583659&0&70"

  8. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
  9. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
  10. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
  11. start /min "" "%SystemRoot%\system32\pnputil.exe" /scan-devices
复制代码
发表于 2023-8-22 22:29:15 | 显示全部楼层
回复 1# yakeyun
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1,* delims=:" %%a in ('pnputil /enum-devices /problem 28 /ids ^| find ":"') do (
  4.     set "ThisRow=%%b"
  5.     if "!ThisRow:RAID 控制器=!" equ "%%b" (
  6.         set "PreRow=%%b"
  7.         set "PreRow=!PreRow: =!"
  8.     ) else (
  9.         goto :ExecDis
  10.     )
  11. )

  12. :ExecDis
  13. echo,!PreRow!
  14. REM 禁用设备的代码放在下面
  15. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
yakeyun + 1 乐于助人

查看全部评分

发表于 2023-8-23 08:56:58 | 显示全部楼层
我使用DevCon命令成功过,要不要试试?
devcon [/r] enable {* | ID [ID ...] | =class [ID [ID ...]]}
DevCon Disable ="@ID"
 楼主| 发表于 2023-8-23 09:38:15 | 显示全部楼层
本帖最后由 yakeyun 于 2023-8-23 10:48 编辑

回复 6# Batcher


管理老大的代码确实可以实现,但是其原理有些看不懂。不是很理解是怎么实现找到上一行信息的,希望老大可以帮忙解释一下,或者能提供相关方面的教程学习提升一下。


执行结果:


 楼主| 发表于 2023-8-23 13:20:31 | 显示全部楼层
回复 7# 986981535

这个属于调用第三方应用,不过也是要获取到“实例ID”才能执行。
发表于 2023-8-23 16:44:48 | 显示全部楼层
回复 8# yakeyun
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 只查找包含冒号的行
  4. for /f "tokens=1,* delims=:" %%a in ('pnputil /enum-devices /problem 28 /ids ^| find ":"') do (
  5.     REM 当前行的值保存到临时变量ThisRow里面
  6.     set "ThisRow=%%b"
  7.     if "!ThisRow:RAID 控制器=!" equ "%%b" (
  8.         REM 如果当前行不包含待查找的关键字,把当前行的值保存到结果变量PreRow里面
  9.         set "PreRow=%%b"
  10.         set "PreRow=!PreRow: =!"
  11.     ) else (
  12.         REM 如果当前行包含待查找的关键字,跳出循环
  13.         REM 结果变量PreRow的值保存的仍然是关键字所在行的上一行
  14.         goto :ExecDis
  15.     )
  16. )

  17. :ExecDis
  18. echo,!PreRow!
  19. REM 禁用设备的代码放在下面
  20. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
yakeyun + 1 技术精湛,乐于助人。

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 15:34 , Processed in 0.023112 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表