[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [技术讨论]批处理通过系统硬件ID匹配驱动文件如何快速匹配


已知可以通过下面代码获取到一台新主机当前没有安装驱动的硬件ID信息:
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. ::==========================自动获取主板型号提取未打驱动ID到目录==========================
  5. ::筛选主板
  6. for /f "delims== tokens=1,*" %%a in ('wmic baseboard get Product^/value ^|find "="') do for /f "delims=," %%c in ("%%b") do set "zbname=%%c"
  7. for /f "delims== tokens=1,*" %%d in ('wmic bios get SMBIOSBIOSVersion^/value ^|find "="') do for /f "delims=," %%f in ("%%e") do set "bios=%%f"
  8. echo,!zbname! 主板BIOS版本:!bios!
  9. echo,!zbname! 主板BIOS版本:!bios!>Name.txt
  10. set "zbname=%zbname: =%"
  11. set "zbname=%zbname:/=-%"
  12. set "zbname=%zbname:(=-%"
  13. set "zbname=%zbname:)=%"
  14. if exist !zbname!.txt (del !zbname!.txt)
  15. echo !zbname! >>Name.txt
  16. ren Name.txt !zbname!.txt
  17. echo.>>!zbname!.txt
  18. echo.>>!zbname!.txt
  19. pnputil /enum-devices /problem 28 /ids >>.\!zbname!.txt
  20. ::==========================自动获取主板型号提取未打驱动ID到目录==========================
  21. exit
复制代码
提取到的文本如下MS-TerminatorB760MD4.txt:
MS-Terminator B760M D4 主板BIOS版本:H3.43G
MS-TerminatorB760MD4


Microsoft PnP 工具

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

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

实例 ID:                PCI\VEN_8086&DEV_A77D&SUBSYS_00000000&REV_01\3&11583659&0&50
设备描述:         PCI 数据捕获和信号处理控制器
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_8086&DEV_A77D&SUBSYS_00000000&REV_01
                            PCI\VEN_8086&DEV_A77D&SUBSYS_00000000
                            PCI\VEN_8086&DEV_A77D&REV_01
                            PCI\VEN_8086&DEV_A77D
                            PCI\VEN_8086&DEV_A77D&CC_118000
                            PCI\VEN_8086&DEV_A77D&CC_1180
兼容 ID:             PCI\VEN_8086&CC_118000
                            PCI\VEN_8086&CC_1180
                            PCI\VEN_8086
                            PCI\CC_118000&DT_9
                            PCI\CC_118000
                            PCI\CC_1180&DT_9
                            PCI\CC_1180

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

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

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

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

实例 ID:                PCI\VEN_8086&DEV_7A70&SUBSYS_02448086&REV_11\3&11583659&0&A3
设备描述:         网络控制器
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:             0xC0000490
硬件 ID:               PCI\VEN_8086&DEV_7A70&SUBSYS_02448086&REV_11
                            PCI\VEN_8086&DEV_7A70&SUBSYS_02448086
                            PCI\VEN_8086&DEV_7A70&CC_028000
                            PCI\VEN_8086&DEV_7A70&CC_0280
兼容 ID:             PCI\VEN_8086&DEV_7A70&REV_11
                            PCI\VEN_8086&DEV_7A70
                            PCI\VEN_8086&CC_028000
                            PCI\VEN_8086&CC_0280
                            PCI\VEN_8086
                            PCI\CC_028000&DT_9
                            PCI\CC_028000
                            PCI\CC_0280&DT_9
                            PCI\CC_0280



      而系统硬件ID和驱动匹配规则是优先匹配硬件ID,匹配优先级从上到下,如果每条ID都匹配不到,然后再匹配兼容ID,匹配优先级从上到下。
从上面信息可以看到,每个硬件ID基本都在10条左右。而驱动目录会放在一个文件夹内,根据名称或者大小版本不同,放在不同子文件夹。
      在匹配之前会先用DIR检索指定目录下的inf驱动文件,然后再用ID去每个inf文件内查找是否有硬件ID关键词。如果找到了关键词,就代表硬件和驱动匹配上了,
然后再用下面命令去安装对于的inf驱动文件:%%a是检索到的inf后缀文件
  1. start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs  /add-driver %%a /install
复制代码
因为有时候硬件ID中不存在匹配信息,只能通过通用ID匹配到,所以如何可以加快每条ID的匹配速度。

回复 21# yakeyun


dir /s /b /a-d  更适合我

TOP

本帖最后由 yakeyun 于 2023-1-9 18:41 编辑

回复 17# idwma


type这个代码更精准,之前打不上的已经可以打上了。应该是这个代码匹配了带*字符前缀的硬件ID。
测试视频:https://sanli.lanzoub.com/iiaIR0kk1uqd
测试包裹:https://sanli.lanzoub.com/iUi0u0kk54ej


修改后有2个版本:
一个是先把匹配的驱动文件输出到install.txt,然后再读取安装。
一个是一边匹配一边安装,感觉第二种速度更快,节省了安装等待时间。


成品代码如下:
  1. @echo off
  2. cd /d "%~dp0"
  3. mode con cols=50 lines=20
  4. setlocal enabledelayedexpansion
  5. ::禁用指定ID的RAID硬件,并刷新硬件列表。
  6. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_88821043&REV_00\3&11583659&0&70"
  7. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  8. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  9. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_00008086&REV_00\3&11583659&0&70"
  10. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  11. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  12. cls
  13. ::=========================提取驱动文件=========================
  14. for /f %%e in ('wmic cpu get name^ /value ^|find /i "intel"') do ((for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\intels\*.inf ') do echo %%b)>"inf.txt")
  15. for /f %%a in ('wmic cpu get name^ /value ^|find /i "AMD"') do ((for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\amds\*.inf ') do echo %%b)>"inf.txt")
  16. (for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\Public\*.inf ') do echo %%b)>>"inf.txt"
  17. ::========================提取驱动ID信息=========================
  18. :run
  19. pnputil /enum-devices /problem 28 /ids >.\ID.txt
  20. for /f %%s in ('type "ID.TXT" ^|find "在系统上找不到任何设备"') do (goto END)
  21. ::======================通过ID匹配驱动安装驱动======================
  22. (
  23. (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
  24.     if "%%b"=="" (
  25. set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
  26. echo;
  27. set /p "=type "%%%%i"|findstr /c:"%%a">nul&&echo "%%%%i" >>install.txt&&goto :id!nn!"<nul
  28. echo;
  29. set /p "=)"<nul
  30. echo;
  31.     ) else if "%%a"=="实例" (
  32. set /a n+=1
  33. set /a nn=!n!+1
  34. echo :id!n!
  35.     ) else (
  36. set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
  37. echo;
  38. set /p "=type "%%%%i"|findstr /c:"%%b">nul&&echo "%%%%i" >>install.txt&&goto :id!nn!"<nul
  39. echo;
  40. set /p "=)"<nul
  41. echo;
  42.     )
  43. ))
  44. set /a n+=1
  45. echo :id!n!
  46. )>ids.bat
  47. call ids.bat
  48. (for /f %%i in (install.txt) do (
  49. start /min "" "%SystemRoot%\system32\pnputil.exe" /add-driver %%i /install
  50. ))
  51. if exist install.txt del install.txt
  52. ::刷新硬件列表更新硬件状态
  53. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  54. cls
  55. ECHO,1> NO1.DLL
  56. ::======================再次检测是否有硬件没有打上驱动======================
  57. if exist NO1.DLL (del NO1.DLL && call :run)
  58. ::=============================清理战场=============================
  59. :END
  60. IF EXIST INSTALL.TXT DEL INSTALL.TXT
  61. IF EXIST ID.TXT DEL ID.TXT
  62. IF EXIST INF.TXT DEL INF.TXT
  63. IF EXIST IDS.BAT DEL IDS.BAT
  64. IF EXIST NO1.DLL DEL NO1.DLL
  65. exit
复制代码
修改后的版本,边匹配边安装,感觉速度更快:
  1. @echo off
  2. cd /d "%~dp0"
  3. mode con cols=50 lines=20
  4. setlocal enabledelayedexpansion
  5. ::禁用指定ID的RAID硬件,并刷新硬件列表。
  6. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_88821043&REV_00\3&11583659&0&70"
  7. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  8. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  9. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_00008086&REV_00\3&11583659&0&70"
  10. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  11. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  12. cls
  13. ::=========================提取驱动文件=========================
  14. for /f %%e in ('wmic cpu get name^ /value ^|find /i "intel"') do ((for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\intels\*.inf ') do echo %%b)>"inf.txt")
  15. for /f %%a in ('wmic cpu get name^ /value ^|find /i "AMD"') do ((for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\amds\*.inf ') do echo %%b)>"inf.txt")
  16. (for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\Public\*.inf ') do echo %%b)>>"inf.txt"
  17. ::========================提取驱动ID信息=========================
  18. :run
  19. pnputil /enum-devices /problem 28 /ids >.\ID.txt
  20. for /f %%s in ('type "ID.TXT" ^|find "在系统上找不到任何设备"') do (goto END)
  21. ::======================通过ID匹配驱动安装驱动======================
  22. (
  23. (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
  24.     if "%%b"=="" (
  25. set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
  26. echo;
  27. set /p "=type "%%%%i"|findstr /c:"%%a">nul&&start /min "" "%SystemRoot%\system32\pnputil.exe" /add-driver "%%%%i" /install&&goto :id!nn!"<nul
  28. echo;
  29. set /p "=)"<nul
  30. echo;
  31.     ) else if "%%a"=="实例" (
  32. set /a n+=1
  33. set /a nn=!n!+1
  34. echo :id!n!
  35.     ) else (
  36. set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
  37. echo;
  38. set /p "=type "%%%%i"|findstr /c:"%%b">nul&&start /min "" "%SystemRoot%\system32\pnputil.exe" /add-driver "%%%%i" /install&&goto :id!nn!"<nul
  39. echo;
  40. set /p "=)"<nul
  41. echo;
  42.     )
  43. ))
  44. set /a n+=1
  45. echo :id!n!
  46. )>ids.bat
  47. call ids.bat
  48. ::刷新硬件列表更新硬件状态
  49. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  50. cls
  51. ECHO,1> NO1.DLL
  52. ::======================再次检测是否有硬件没有打上驱动======================
  53. if exist NO1.DLL (del NO1.DLL && call :run)
  54. ::=============================清理战场=============================
  55. :END
  56. IF EXIST INSTALL.TXT DEL INSTALL.TXT
  57. IF EXIST ID.TXT DEL ID.TXT
  58. IF EXIST INF.TXT DEL INF.TXT
  59. IF EXIST IDS.BAT DEL IDS.BAT
  60. IF EXIST NO1.DLL DEL NO1.DLL
  61. exit
复制代码

TOP

本帖最后由 yakeyun 于 2023-1-8 09:53 编辑

回复 17# idwma


大佬的代码我明天测试下看看,这个需要借用我之前分享的"纯批处理写入映像到USB移动盘",制作的WIN TO GO 硬盘。
移动盘里面安装了一个影子系统软件,重启系统后所有的操作都还原了,所以测试一些驱动或者危险操作很方便。

[分享]Windows下拖放文件到纯批处理上给第三方磁盘分区装系统 - BAT求助&讨论 - 批处理之家 批处理_BAT脚本_PowerShell_VBS_CMD_DOS_Perl_Python - Powered by Discuz!  http://www.bathome.net/thread-63279-1-1.html


代码测试完毕,可以正常匹配到,通过显示的驱动信息可以看到,之前推断的是正确的,说明这个154KB驱动还是有些问题的。
进一步对2个版本的驱动文本进行对比,发现160KB的比154KB的版本要高,同时160KB的包含了154KB驱动的全部硬件信息,还多出一些额外的新硬件信息。
最终只需要将154KB文件淘汰处理,直接删除就可以解决问题。






TOP

本帖最后由 yakeyun 于 2023-1-8 09:56 编辑

最终代码如下,如果出现打不上的驱动,就直接将对应的驱动换到,也方便排除有问题或无用的驱动:
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. ::禁用指定ID的RAID硬件,并刷新硬件列表。
  5. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_88821043&REV_00\3&11583659&0&70"
  6. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  7. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  8. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_00008086&REV_00\3&11583659&0&70"
  9. call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
  10. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  11. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  12. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  13. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  14. cls
  15. ::==========================自动获取主板型号提取未打驱动ID到目录==========================
  16. pnputil /enum-devices /problem 28 /ids >.\ID.txt
  17. ::==========================自动获取主板型号提取未打驱动ID到目录==========================
  18. (
  19. (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
  20.     if "%%b"=="" (
  21. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
  22. echo;
  23. echo start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs  /add-driver "%~dp0%%%%i"  /install
  24. echo goto :id!nn!
  25. set /p "=)"<nul
  26. echo;
  27.     ) else if "%%a"=="实例" (
  28. set /a n+=1
  29. set /a nn=!n!+1
  30. echo :id!n!
  31.     ) else (
  32. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
  33. echo;
  34. echo  start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs  /add-driver "%~dp0%%%%i"  /install
  35. echo goto :id!nn!
  36. set /p "=)"<nul
  37. echo;
  38.     )
  39. ))
  40. set /a n+=1
  41. echo :id!n!
  42. )>ids.bat
  43. call ids.bat
  44. ::刷新硬件列表更新硬件状态
  45. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  46. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  47. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  48. call "%SystemRoot%\system32\pnputil.exe" /scan-devices
  49. cls
  50. exit
复制代码
测试包打包下载地址:
https://sanli.lanzoub.com/iqJsm0kdwd5e

TOP

本帖最后由 yakeyun 于 2023-1-7 22:59 编辑

回复 16# Batcher


老大稍等下,我正在完善功能,完善后一起打包上传,到时候各位大佬可以看下还有没有更完美的方案,在其基础上继续修改。

测试包打包下载地址:
https://sanli.lanzoub.com/iqJsm0kdwd5e

TOP

这个文件是unicode编码试试用type来显示
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. (
  5. (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
  6.     if "%%b"=="" (
  7. set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
  8. echo;
  9. set /p "=type "%%%%i"|findstr /c:"%%a">nul&&echo %%%%i&&goto :id!nn!"<nul
  10. echo;
  11. set /p "=)"<nul
  12. echo;
  13.     ) else if "%%a"=="实例" (
  14. set /a n+=1
  15. set /a nn=!n!+1
  16. echo :id!n!
  17.     ) else (
  18. set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
  19. echo;
  20. set /p "=type "%%%%i"|findstr /c:"%%b">nul&&echo %%%%i&&goto :id!nn!"<nul
  21. echo;
  22. set /p "=)"<nul
  23. echo;
  24.     )
  25. ))
  26. set /a n+=1
  27. echo :id!n!
  28. )>ids.bat
  29. call ids.bat
复制代码

TOP

回复 15# yakeyun


    请把txt、bat、inf打包压缩上传到网盘,我试试
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 yakeyun 于 2023-1-7 21:23 编辑

最后一个没有匹配上的驱动,通过分析暂时看不出来有什么问题。
因为文件里面是可以检索到ID信息的。




最后的一个匹配不上原因也找到了:因为同一个驱动存在3个版本,6S和7S目录都有一个160KB的相同驱动文件,这两个实际上就是同一个版本驱动,而另一个是6S里面存在一个154KB的驱动。由于文件排序是由小到大,所以匹配到的就是154的文件。
因为匹配规则就是只匹配一次,然后跳转到下一个硬件,所以即使有更好一些的驱动,也不会再匹配。刚好这个文件和硬件可以匹配,但是无法使用,造成驱动安装上去了,但是硬件无法驱动。
用dpinst安装也会出现漏打的原因就在这里,因为已经匹配并安装了一个驱动,所以后面即使有其它更好的版本,也不会再继续安装。如果要安装更好的驱动,需要在dpinst命令后面加上“/F” 强制安装更好的驱动。




windows dpinst 安装驱动命令  https://blog.csdn.net/u010096608/article/details/114634946


这个驱动匹配安装的最终代码,会在整理完善后公开到批处理之家,希望给到有需要的人,也算是纯批处理安装驱动的一个开源方案。

TOP

本帖最后由 yakeyun 于 2023-1-7 19:34 编辑

回复 13# idwma

大佬的方法不错,已经完全匹配上了,代码执行后会自动提取ID信息到新的bat执行文档,匹配后会自动跳转到下一个硬件位置。
因为RAID驱动集成后开机容易蓝屏,所以默认是没有收集它的驱动包,匹配数量和缺失数量对的上。




附上测试视频:
https://sanli.lanzoub.com/i8HfT0kcqrpg


修改后的版本,直接将路径显示命令改成驱动安装命令:
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. (
  5. (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
  6.     if "%%b"=="" (
  7. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
  8. echo;
  9. echo start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs  /add-driver "%~dp0%%%%i"  /install
  10. echo goto :id!nn!
  11. set /p "=)"<nul
  12. echo;
  13.     ) else if "%%a"=="实例" (
  14. set /a n+=1
  15. set /a nn=!n!+1
  16. echo :id!n!
  17.     ) else (
  18. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
  19. echo;
  20. echo  start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs  /add-driver "%~dp0%%%%i"  /install
  21. echo goto :id!nn!
  22. set /p "=)"<nul
  23. echo;
  24.     )
  25. ))
  26. set /a n+=1
  27. echo :id!n!
  28. )>ids.bat
  29. call ids.bat
  30. exit
复制代码

TOP

回复 12# yakeyun
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. (
  5. (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
  6.     if "%%b"=="" (
  7. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
  8. echo;
  9. echo echo "%~dp0%%%%i"
  10. echo goto :id!nn!
  11. set /p "=)"<nul
  12. echo;
  13.     ) else if "%%a"=="实例" (
  14. set /a n+=1
  15. set /a nn=!n!+1
  16. echo :id!n!
  17.     ) else (
  18. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
  19. echo;
  20. echo echo "%~dp0%%%%i"
  21. echo goto :id!nn!
  22. set /p "=)"<nul
  23. echo;
  24.     )
  25. ))
  26. set /a n+=1
  27. echo :id!n!
  28. )>ids.bat
  29. call ids.bat
  30. pause
  31. exit
复制代码

TOP

本帖最后由 yakeyun 于 2023-1-7 18:00 编辑

回复 11# idwma

大佬您的这个代码报错了,运行不起来,ID都是带中文的ANSI编码。
测试结果视频:https://sanli.lanzoub.com/i8HfT0kcqrpg



系统总共缺少11个驱动

我用我最后写的代码,可以正常匹配和打上驱动,但是由于没有匹配中断命令,所以会打一些重复的驱动进去。检索出的inf文件总共45条,打上去的有19个,有2个没有匹配上,说明多打了10个驱动进去:





用第三方软件“dpinst.exe”打上去的只有9个,有2个没有匹配上,说明没有集成多余驱动,但是匹配还不完全:
dpinst.exe工具相比于pnputil.exe和devcon.exe,可以做到只安装缺失的驱动,所以不会安装多余的。但是缺点是只能安装即插即用设备驱动,所以会存在漏打的情况。

TOP

本帖最后由 idwma 于 2023-1-7 16:28 编辑

如果id.txt是utf8先chcp 437再执行pnputil,然后把判断的"实例"改成英文的
  1. (
  2. (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
  3.     if "%%b"=="" (
  4. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
  5. echo;
  6. echo echo "%~dp0%%%%i"
  7. echo goto :id!nn!
  8. set /p "=)"<nul
  9. echo;
  10.     ) else if "%%a"=="实例" (
  11. set /a n+=1
  12. set /a nn=!n!+1
  13. echo :id!n!
  14.     ) else (
  15. set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
  16. echo;
  17. echo echo "%~dp0%%%%i"
  18. echo goto :id!nn!
  19. set /p "=)"<nul
  20. echo;
  21.     )
  22. ))
  23. set /a n+=1
  24. echo :id!n!
  25. )>ids.bat
  26. call ids.bat
复制代码

TOP

本帖最后由 yakeyun 于 2023-1-7 16:10 编辑

最终类似代码如下,已经可以完整实现匹配功能了,但是不知道怎么解决当代码在匹配到文件后,跳过当前其它子ID的匹配,而去进行下一个硬件的ID匹配:
  1. @echo off & setlocal enabledelayedexpansion
  2. title 批处理程序 by.SanLi
  3. color 07
  4. mode con: cols=80 lines=25
  5. chcp 936 >nul
  6. echo 当前系统时间:2022/08/31 周三-12:07:21.99
  7. ::=========================自动获取主板型号提取未打驱动ID到目录=========================
  8. if not exist ID.TXT (pnputil /enum-devices /problem 28 /ids >.\ID.txt)
  9. ::===============================整理ID文档为纯ID数据===============================
  10. if not exist ID.TXT ((for /f "tokens=3 delims=: " %%a in ('findstr /c:" ID" "ID.txt"') do echo %%a)>"IDS.txt")
  11. (for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\*.inf ') do echo %%b)>"inf.txt"
  12. (for /f "delims=," %%i in (IDS.txt) do (
  13.   for /f "delims=," %%j in (inf.txt) do (
  14.       for /f "delims=" %%k in ('findstr /s /m "%%i" %%j') do (
  15. echo %%k
  16. start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs  /add-driver %%k /install
  17. ))))
  18. pause
  19. exit
复制代码



测试文件打包地址:
https://sanli.lanzoub.com/iRhk40kcn2ad

测试包里面放置了Sed文件,是为了后续将ID.TXT修改为IDS.TXT用的,代码暂时没加进去。因为匹配速度比较慢,先解决匹配速度问题。

TOP

本帖最后由 yakeyun 于 2023-1-7 09:22 编辑

回复 8# idwma

可以是可以,但是对个别硬件不是很友好,比如开头的倒数第3个硬件,就只能取到一个硬件ID。
我的想法是直接用替换法,先提取全部缺少驱动的硬件ID文档,然后把以“实例 ID”开头的行替换为:
“硬件编号=1”
.....
“硬件编号=N”
这样后面当硬件1通过ID匹配完毕后,就跳到硬件2继续用下面的ID匹配,然后直到硬件N。

实例 ID:                PCI\VEN_8086&DEV_7A4D&SUBSYS_00000000&REV_11\3&11583659&0&A9
设备描述:         PCI 设备
类名:                 未知
类 GUID:                 未知
制造商名称:          未知
状态:                     问题
问题代码:               28 (0x1C) [CM_PROB_FAILED_INSTALL]
问题状态:



提取后的ID文档信息如下:
硬件编号=1
PCI\VEN_8086&DEV_7A4D&SUBSYS_00000000&REV_11
PCI\VEN_8086&DEV_7A4D&SUBSYS_00000000
PCI\VEN_8086&DEV_7A4D&REV_11
PCI\VEN_8086&DEV_7A4D
PCI\VEN_8086&DEV_7A4D&CC_0C8000
PCI\VEN_8086&DEV_7A4D&CC_0C80
PCI\VEN_8086&CC_0C8000
PCI\VEN_8086&CC_0C80
PCI\VEN_8086
PCI\CC_0C8000
PCI\CC_0C80

硬件编号=2
PCI\VEN_8086&DEV_7A24&SUBSYS_00000000
PCI\VEN_8086&DEV_7A24&REV_11
PCI\VEN_8086&DEV_7A24
PCI\VEN_8086&DEV_7A24&CC_0C8000
PCI\VEN_8086&DEV_7A24&CC_0C80
PCI\VEN_8086&CC_0C8000
PCI\VEN_8086&CC_0C80
PCI\VEN_8086
PCI\CC_0C8000
PCI\CC_0C80

硬件编号=3
PCI\VEN_8086&DEV_A77D&SUBSYS_00000000&REV_01
PCI\VEN_8086&DEV_A77D&SUBSYS_00000000
PCI\VEN_8086&DEV_A77D&REV_01
PCI\VEN_8086&DEV_A77D
PCI\VEN_8086&DEV_A77D&CC_118000
PCI\VEN_8086&DEV_A77D&CC_1180
PCI\VEN_8086&CC_118000
PCI\VEN_8086&CC_1180
PCI\VEN_8086
PCI\CC_118000&DT_9
PCI\CC_118000
PCI\CC_1180&DT_9
PCI\CC_1180

硬件编号=4
PCI\VEN_8086&DEV_7A68&SUBSYS_00000000&REV_11
PCI\VEN_8086&DEV_7A68&SUBSYS_00000000
PCI\VEN_8086&DEV_7A68&REV_11
PCI\VEN_8086&DEV_7A68
PCI\VEN_8086&DEV_7A68&CC_078000
PCI\VEN_8086&DEV_7A68&CC_0780
PCI\VEN_8086&CC_078000
PCI\VEN_8086&CC_0780
PCI\VEN_8086
PCI\CC_078000
PCI\CC_0780

硬件编号=5
PCI\VEN_8086&DEV_7A4C&SUBSYS_00000000&REV_11
PCI\VEN_8086&DEV_7A4C&SUBSYS_00000000
PCI\VEN_8086&DEV_7A4C&REV_11
PCI\VEN_8086&DEV_7A4C
PCI\VEN_8086&DEV_7A4C&CC_0C8000
PCI\VEN_8086&DEV_7A4C&CC_0C80
PCI\VEN_8086&CC_0C8000
PCI\VEN_8086&CC_0C80
PCI\VEN_8086
PCI\CC_0C8000
PCI\CC_0C80

硬件编号=6
ACPI\VEN_INTC&DEV_1085
ACPI\INTC1085
*INTC1085

硬件编号=7
PCI\VEN_8086&DEV_7A23&SUBSYS_00000000&REV_11
PCI\VEN_8086&DEV_7A23&SUBSYS_00000000
PCI\VEN_8086&DEV_7A23&REV_11
PCI\VEN_8086&DEV_7A23
PCI\VEN_8086&DEV_7A23&CC_0C0500
PCI\VEN_8086&DEV_7A23&CC_0C05
PCI\VEN_8086&CC_0C0500
PCI\VEN_8086&CC_0C05
PCI\VEN_8086
PCI\CC_0C0500
PCI\CC_0C05

硬件编号=8
PCI\VEN_8086&DEV_7A70&SUBSYS_02448086&REV_11
PCI\VEN_8086&DEV_7A70&SUBSYS_02448086
PCI\VEN_8086&DEV_7A70&CC_028000
PCI\VEN_8086&DEV_7A70&CC_0280
PCI\VEN_8086&DEV_7A70&REV_11
PCI\VEN_8086&DEV_7A70
PCI\VEN_8086&CC_028000
PCI\VEN_8086&CC_0280
PCI\VEN_8086
PCI\CC_028000&DT_9
PCI\CC_028000
PCI\CC_0280&DT_9
PCI\CC_0280


dir命令获取到的INF信息如下:
G:\intels\103_hideventfilter\hideventfilter.inf
G:\intels\23.1_pieextension\pieextension.inf
G:\intels\327_heci\heci.inf
G:\intels\328_heci\heci.inf
G:\intels\5s\14.3_skylakesystemthermal\skylakesystemthermal.inf
G:\intels\5s\14.4_skylakesystemgmm\skylakesystemgmm.inf
G:\intels\5s\145_ialpss2_gpio2_tgl\ialpss2_gpio2_tgl.inf
G:\intels\5s\148_ialpss2_gpio2_tgl\ialpss2_gpio2_tgl.inf
G:\intels\5s\177_ialpss2_spi_tgl\ialpss2_spi_tgl.inf
G:\intels\5s\19.9_tigerlakesystem\tigerlakesystem.inf
G:\intels\5s\217_ialpss2_i2c_tgl\ialpss2_i2c_tgl.inf
G:\intels\5s\224_ialpss2_i2c_tgl\ialpss2_i2c_tgl.inf
G:\intels\5s\25.8_tigerlakepch-hsystemlpss\tigerlakepch-hsystemlpss.inf
G:\intels\5s\32.9_tigerlakepch-hsystem\tigerlakepch-hsystem.inf
G:\intels\5s\329_ialpss2_uart2_tgl\ialpss2_uart2_tgl.inf
G:\intels\5s\337_heci\heci.inf
G:\intels\5s\34.3_tigerlakepch-hsystem\tigerlakepch-hsystem.inf
G:\intels\5s\98.6_dptf_acpi\dptf_acpi.inf
G:\intels\6s\104_gna\gna.inf
G:\intels\6s\154_ialpss2_gpio2_adl\ialpss2_gpio2_adl.inf
G:\intels\6s\160KB_ialpss2_gpio2_adl\ialpss2_gpio2_adl.inf
G:\intels\6s\176_ialpss2_spi_adl\ialpss2_spi_adl.inf
G:\intels\6s\217_ialpss2_i2c_adl\ialpss2_i2c_adl.inf
G:\intels\6s\233KB_ialpss2_i2c_adl\ialpss2_i2c_adl.inf
G:\intels\6s\24.8_alderlakepch-ssystemlpss\alderlakepch-ssystemlpss.inf
G:\intels\6s\25.0_alderlakesystem\alderlakesystem.inf
G:\intels\6s\314KB_heci\heci.inf
G:\intels\6s\330_ialpss2_uart2_adl\ialpss2_uart2_adl.inf
G:\intels\6s\332_heci\heci.inf
G:\intels\6s\34.0_alderlakepch-ssystem\alderlakepch-ssystem.inf
G:\intels\6s\34.3_alderlakepch-ssystem\alderlakepch-ssystem.inf
G:\intels\6s\34.8KB_alderlakepch-ssystem\alderlakepch-ssystem.inf
G:\intels\6s\8086\AlderLakePCH-SSystem.inf
G:\intels\6s\8086\AlderLakePCH-SSystemLPSS.inf
G:\intels\6s\8086\AlderLakePCH-SSystemNorthpeak.inf
G:\intels\7s\105KB_hideventfilter\hideventfilter.inf
G:\intels\7s\13.7KB_raptorlakesystem\raptorlakesystem.inf
G:\intels\7s\160KB_ialpss2_gpio2_adl\ialpss2_gpio2_adl.inf
G:\intels\7s\184KB_ialpss2_spi_adl\ialpss2_spi_adl.inf
G:\intels\7s\23.6KB_pieextension\pieextension.inf
G:\intels\7s\233KB_ialpss2_i2c_adl\ialpss2_i2c_adl.inf
G:\intels\7s\338KB_ialpss2_uart2_adl\ialpss2_uart2_adl.inf
G:\intels\7s\34.7KB_raptorlakepch-ssystem\raptorlakepch-ssystem.inf
G:\intels\7s\341KB_heci\heci.inf


最终达到的效果是先提取信息到文档1,然后对ID信息处理后只保留ID硬件标识和其对应的硬件ID信息。然后获取指定目录下的所有INF文件到文档2,
最后从文档1读取信息,用硬件1下面的ID去所有文档2中匹配,如果找到了就执行安装命令,同时跳转到硬件2继续用其下面的ID匹配和执行安装,直到执行完硬件N。

TOP

返回列表