[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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的匹配速度。

本帖最后由 idwma 于 2023-1-5 20:40 编辑
  1. (for /f "tokens=3 delims=: " %%i in ('findstr /c:" ID" "!zbname!.txt"') do echo %%i)>"!zbname!id.txt"
  2. for /f "delims=" %%a in ('findstr /s /m /g:"!zbname!id.txt" *.inf') do  echo %%a
复制代码

TOP

不是,有的硬件不需要驱动程序······
一个爱好编程的小学生。

TOP

回复 2# idwma

目前测试没有匹配到文档:





以”网络控制器“为例:

实例 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:“的条目:
PCI\VEN_8086&DEV_7A70&SUBSYS_02448086&REV_11\3&11583659&0&A3
PCI\VEN_8086&DEV_7A70&SUBSYS_02448086&REV_11
PCI\VEN_8086&DEV_7A70&REV_11

    实际上驱动匹配规则是,以下面顺序进行匹配:

硬件 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.TXT:
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

匹配文档为*.inf,此处的inf文件可能有10到20个左右,文件名可能相同,也可能不同,但是存放路径是不一样的。

最终达到的效果是,先Dir获取到驱动目录位置。然后从ID文档中一条一条去匹配N个inf文件,如果匹配到了就执行驱动安装命令(start...)。
ID文档目录最好有一个标记文件,用以代表一个硬件,用符号隔离起来,方便后面驱动完毕,就跳过这一条的所有子ID。
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. ::==========================自动获取主板型号提取未打驱动ID到目录==========================
  5. pnputil /enum-devices /problem 28 /ids >.\IDS.txt
  6. ::==========================自动获取主板型号提取未打驱动ID到目录==========================
  7. (for /f "tokens=3 delims=: " %%a in ('findstr /c:" ID" "IDS.txt"') do echo %%a)>"ID.txt"
  8. for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\*.inf ') do (
  9. for /f "delims=" %%i in ('findstr /s /m /g:"ID.txt" %%b') do  (
  10. start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs  /add-driver %%i /install
  11. ))
  12. pause
  13. exit
复制代码

TOP

帮助里的例子这样不是可以自动匹配吗
  1. pnputil.exe /add-driver *.inf /subdirs /install
复制代码

TOP

回复 5# idwma

这个安装是把所有检索到的驱动都安装进去了,并不是什么硬件缺少驱动,就安装什么。相当于即使没有这个硬件,也会把驱动安装上去。

TOP

回复 5# idwma

用下面代码调用第三方程序可以打,但是也会或多或少打些不必要的驱动上去。
  1. ::驱动安装
  2. @echo off&setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. for /f "tokens=* delims=, " %%a in ('dir /s /b /a:d .\') do (
  5.     set /a n+=1
  6.     set /a m=n%%20
  7.     if !m! equ 0 (
  8.           Timeout /t 1 >nul
  9.     )
  10. echo %%a
  11. start /min "" "dpinst" /PATH %%a /Q  /SH
  12. )
  13. exit
复制代码

TOP

id只查找以VEN_xxxx&DEV_xxxx这样结尾的行可以吗,这样不会有重复的
驱动都是按这两个id来匹配的吧

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

本帖最后由 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

本帖最后由 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 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

回复 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 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

本帖最后由 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

返回列表