Board logo

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

作者: yakeyun    时间: 2023-8-22 14:22     标题: [已解决]禁用RAID设备的批处理执行结果和实际有出入

本帖最后由 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:" 所在行信息。



作者: buyiyang    时间: 2023-8-22 15:23

因为for跳过了空行。你为什么不直接findstr "实例 ID"呢
作者: yakeyun    时间: 2023-8-22 17:09

本帖最后由 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
作者: buyiyang    时间: 2023-8-22 17:32

回复 3# yakeyun


    用兼容ID
作者: yakeyun    时间: 2023-8-22 18:02

回复 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
复制代码

作者: Batcher    时间: 2023-8-22 22:29

回复 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
复制代码

作者: 986981535    时间: 2023-8-23 08:56

我使用DevCon命令成功过,要不要试试?
devcon [/r] enable {* | ID [ID ...] | =class [ID [ID ...]]}
DevCon Disable ="@ID"
作者: yakeyun    时间: 2023-8-23 09:38

本帖最后由 yakeyun 于 2023-8-23 10:48 编辑

回复 6# Batcher


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


执行结果:



作者: yakeyun    时间: 2023-8-23 13:20

回复 7# 986981535

这个属于调用第三方应用,不过也是要获取到“实例ID”才能执行。
作者: Batcher    时间: 2023-8-23 16:44

回复 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
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2