标题: [文本处理] [技术讨论]批处理通过系统硬件ID匹配驱动文件如何快速匹配 [打印本页]
作者: yakeyun 时间: 2023-1-5 19:12 标题: [技术讨论]批处理通过系统硬件ID匹配驱动文件如何快速匹配
已知可以通过下面代码获取到一台新主机当前没有安装驱动的硬件ID信息:- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- ::==========================自动获取主板型号提取未打驱动ID到目录==========================
- ::筛选主板
- for /f "delims== tokens=1,*" %%a in ('wmic baseboard get Product^/value ^|find "="') do for /f "delims=," %%c in ("%%b") do set "zbname=%%c"
- for /f "delims== tokens=1,*" %%d in ('wmic bios get SMBIOSBIOSVersion^/value ^|find "="') do for /f "delims=," %%f in ("%%e") do set "bios=%%f"
- echo,!zbname! 主板BIOS版本:!bios!
- echo,!zbname! 主板BIOS版本:!bios!>Name.txt
- set "zbname=%zbname: =%"
- set "zbname=%zbname:/=-%"
- set "zbname=%zbname:(=-%"
- set "zbname=%zbname:)=%"
- if exist !zbname!.txt (del !zbname!.txt)
- echo !zbname! >>Name.txt
- ren Name.txt !zbname!.txt
- echo.>>!zbname!.txt
- echo.>>!zbname!.txt
- pnputil /enum-devices /problem 28 /ids >>.\!zbname!.txt
- ::==========================自动获取主板型号提取未打驱动ID到目录==========================
- 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后缀文件- start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs /add-driver %%a /install
复制代码
因为有时候硬件ID中不存在匹配信息,只能通过通用ID匹配到,所以如何可以加快每条ID的匹配速度。
作者: idwma 时间: 2023-1-5 20:31
本帖最后由 idwma 于 2023-1-5 20:40 编辑
- (for /f "tokens=3 delims=: " %%i in ('findstr /c:" ID" "!zbname!.txt"') do echo %%i)>"!zbname!id.txt"
- for /f "delims=" %%a in ('findstr /s /m /g:"!zbname!id.txt" *.inf') do echo %%a
复制代码
作者: bat1152 时间: 2023-1-6 08:10
不是,有的硬件不需要驱动程序······
作者: yakeyun 时间: 2023-1-6 10:41
回复 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。- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- ::==========================自动获取主板型号提取未打驱动ID到目录==========================
- pnputil /enum-devices /problem 28 /ids >.\IDS.txt
- ::==========================自动获取主板型号提取未打驱动ID到目录==========================
-
- (for /f "tokens=3 delims=: " %%a in ('findstr /c:" ID" "IDS.txt"') do echo %%a)>"ID.txt"
- for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\*.inf ') do (
- for /f "delims=" %%i in ('findstr /s /m /g:"ID.txt" %%b') do (
- start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs /add-driver %%i /install
- ))
- pause
- exit
复制代码
作者: idwma 时间: 2023-1-6 14:35
帮助里的例子这样不是可以自动匹配吗- pnputil.exe /add-driver *.inf /subdirs /install
复制代码
作者: yakeyun 时间: 2023-1-6 16:56
回复 5# idwma
这个安装是把所有检索到的驱动都安装进去了,并不是什么硬件缺少驱动,就安装什么。相当于即使没有这个硬件,也会把驱动安装上去。
作者: yakeyun 时间: 2023-1-6 19:04
回复 5# idwma
用下面代码调用第三方程序可以打,但是也会或多或少打些不必要的驱动上去。- ::驱动安装
- @echo off&setlocal enabledelayedexpansion
- cd /d "%~dp0"
- for /f "tokens=* delims=, " %%a in ('dir /s /b /a:d .\') do (
- set /a n+=1
- set /a m=n%%20
- if !m! equ 0 (
- Timeout /t 1 >nul
- )
- echo %%a
- start /min "" "dpinst" /PATH %%a /Q /SH
- )
-
- exit
复制代码
作者: idwma 时间: 2023-1-6 19:40
id只查找以VEN_xxxx&DEV_xxxx这样结尾的行可以吗,这样不会有重复的
驱动都是按这两个id来匹配的吧
作者: yakeyun 时间: 2023-1-7 09:15
本帖最后由 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。
作者: yakeyun 时间: 2023-1-7 15:43
本帖最后由 yakeyun 于 2023-1-7 16:10 编辑
最终类似代码如下,已经可以完整实现匹配功能了,但是不知道怎么解决当代码在匹配到文件后,跳过当前其它子ID的匹配,而去进行下一个硬件的ID匹配:- @echo off & setlocal enabledelayedexpansion
- title 批处理程序 by.SanLi
- color 07
- mode con: cols=80 lines=25
- chcp 936 >nul
- echo 当前系统时间:2022/08/31 周三-12:07:21.99
-
- ::=========================自动获取主板型号提取未打驱动ID到目录=========================
- if not exist ID.TXT (pnputil /enum-devices /problem 28 /ids >.\ID.txt)
- ::===============================整理ID文档为纯ID数据===============================
- if not exist ID.TXT ((for /f "tokens=3 delims=: " %%a in ('findstr /c:" ID" "ID.txt"') do echo %%a)>"IDS.txt")
- (for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\*.inf ') do echo %%b)>"inf.txt"
- (for /f "delims=," %%i in (IDS.txt) do (
- for /f "delims=," %%j in (inf.txt) do (
- for /f "delims=" %%k in ('findstr /s /m "%%i" %%j') do (
- echo %%k
- start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs /add-driver %%k /install
- ))))
- pause
- exit
复制代码
测试文件打包地址:
https://sanli.lanzoub.com/iRhk40kcn2ad
测试包里面放置了Sed文件,是为了后续将ID.TXT修改为IDS.TXT用的,代码暂时没加进去。因为匹配速度比较慢,先解决匹配速度问题。
作者: idwma 时间: 2023-1-7 16:19
本帖最后由 idwma 于 2023-1-7 16:28 编辑
如果id.txt是utf8先chcp 437再执行pnputil,然后把判断的"实例"改成英文的- (
- (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
- if "%%b"=="" (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
- echo;
- echo echo "%~dp0%%%%i"
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- ) else if "%%a"=="实例" (
- set /a n+=1
- set /a nn=!n!+1
- echo :id!n!
- ) else (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
- echo;
- echo echo "%~dp0%%%%i"
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- )
- ))
- set /a n+=1
- echo :id!n!
- )>ids.bat
- call ids.bat
复制代码
作者: yakeyun 时间: 2023-1-7 17:21
本帖最后由 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,可以做到只安装缺失的驱动,所以不会安装多余的。但是缺点是只能安装即插即用设备驱动,所以会存在漏打的情况。
作者: idwma 时间: 2023-1-7 18:00
回复 12# yakeyun - @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- (
- (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
- if "%%b"=="" (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
- echo;
- echo echo "%~dp0%%%%i"
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- ) else if "%%a"=="实例" (
- set /a n+=1
- set /a nn=!n!+1
- echo :id!n!
- ) else (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
- echo;
- echo echo "%~dp0%%%%i"
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- )
- ))
- set /a n+=1
- echo :id!n!
- )>ids.bat
- call ids.bat
- pause
- exit
复制代码
作者: yakeyun 时间: 2023-1-7 18:51
本帖最后由 yakeyun 于 2023-1-7 19:34 编辑
回复 13# idwma
大佬的方法不错,已经完全匹配上了,代码执行后会自动提取ID信息到新的bat执行文档,匹配后会自动跳转到下一个硬件位置。
因为RAID驱动集成后开机容易蓝屏,所以默认是没有收集它的驱动包,匹配数量和缺失数量对的上。
附上测试视频:
https://sanli.lanzoub.com/i8HfT0kcqrpg
修改后的版本,直接将路径显示命令改成驱动安装命令:- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- (
- (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
- if "%%b"=="" (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
- echo;
- echo start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs /add-driver "%~dp0%%%%i" /install
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- ) else if "%%a"=="实例" (
- set /a n+=1
- set /a nn=!n!+1
- echo :id!n!
- ) else (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
- echo;
- echo start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs /add-driver "%~dp0%%%%i" /install
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- )
- ))
- set /a n+=1
- echo :id!n!
- )>ids.bat
- call ids.bat
- exit
复制代码
作者: yakeyun 时间: 2023-1-7 19:42
本帖最后由 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
这个驱动匹配安装的最终代码,会在整理完善后公开到批处理之家,希望给到有需要的人,也算是纯批处理安装驱动的一个开源方案。
作者: Batcher 时间: 2023-1-7 20:36
回复 15# yakeyun
请把txt、bat、inf打包压缩上传到网盘,我试试
作者: idwma 时间: 2023-1-7 21:03
这个文件是unicode编码试试用type来显示- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- (
- (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
- if "%%b"=="" (
- set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
- echo;
- set /p "=type "%%%%i"|findstr /c:"%%a">nul&&echo %%%%i&&goto :id!nn!"<nul
- echo;
- set /p "=)"<nul
- echo;
- ) else if "%%a"=="实例" (
- set /a n+=1
- set /a nn=!n!+1
- echo :id!n!
- ) else (
- set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
- echo;
- set /p "=type "%%%%i"|findstr /c:"%%b">nul&&echo %%%%i&&goto :id!nn!"<nul
- echo;
- set /p "=)"<nul
- echo;
- )
- ))
- set /a n+=1
- echo :id!n!
- )>ids.bat
- call ids.bat
复制代码
作者: yakeyun 时间: 2023-1-7 22:16
本帖最后由 yakeyun 于 2023-1-7 22:59 编辑
回复 16# Batcher
老大稍等下,我正在完善功能,完善后一起打包上传,到时候各位大佬可以看下还有没有更完美的方案,在其基础上继续修改。
测试包打包下载地址:
https://sanli.lanzoub.com/iqJsm0kdwd5e
作者: yakeyun 时间: 2023-1-7 22:31
本帖最后由 yakeyun 于 2023-1-8 09:56 编辑
最终代码如下,如果出现打不上的驱动,就直接将对应的驱动换到,也方便排除有问题或无用的驱动:- @echo off
- cd /d "%~dp0"
- setlocal enabledelayedexpansion
- ::禁用指定ID的RAID硬件,并刷新硬件列表。
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_88821043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_00008086&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- cls
- ::==========================自动获取主板型号提取未打驱动ID到目录==========================
- pnputil /enum-devices /problem 28 /ids >.\ID.txt
- ::==========================自动获取主板型号提取未打驱动ID到目录==========================
- (
- (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
- if "%%b"=="" (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%a" *.inf') do ("<nul
- echo;
- echo start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs /add-driver "%~dp0%%%%i" /install
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- ) else if "%%a"=="实例" (
- set /a n+=1
- set /a nn=!n!+1
- echo :id!n!
- ) else (
- set /p "=for /f "delims=" %%%%i in ('findstr /s /m /c:"%%b" *.inf') do ("<nul
- echo;
- echo start /min "" "%SystemRoot%\system32\pnputil.exe" /subdirs /add-driver "%~dp0%%%%i" /install
- echo goto :id!nn!
- set /p "=)"<nul
- echo;
- )
- ))
- set /a n+=1
- echo :id!n!
- )>ids.bat
- call ids.bat
- ::刷新硬件列表更新硬件状态
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- cls
- exit
复制代码
测试包打包下载地址:
https://sanli.lanzoub.com/iqJsm0kdwd5e
作者: yakeyun 时间: 2023-1-7 22:36
本帖最后由 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文件淘汰处理,直接删除就可以解决问题。
作者: yakeyun 时间: 2023-1-9 18:19
本帖最后由 yakeyun 于 2023-1-9 18:41 编辑
回复 17# idwma
type这个代码更精准,之前打不上的已经可以打上了。应该是这个代码匹配了带*字符前缀的硬件ID。
测试视频:https://sanli.lanzoub.com/iiaIR0kk1uqd
测试包裹:https://sanli.lanzoub.com/iUi0u0kk54ej
修改后有2个版本:
一个是先把匹配的驱动文件输出到install.txt,然后再读取安装。
一个是一边匹配一边安装,感觉第二种速度更快,节省了安装等待时间。
成品代码如下:- @echo off
- cd /d "%~dp0"
- mode con cols=50 lines=20
- setlocal enabledelayedexpansion
-
- ::禁用指定ID的RAID硬件,并刷新硬件列表。
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_88821043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_00008086&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- cls
- ::=========================提取驱动文件=========================
- 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")
- 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")
- (for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\Public\*.inf ') do echo %%b)>>"inf.txt"
- ::========================提取驱动ID信息=========================
- :run
- pnputil /enum-devices /problem 28 /ids >.\ID.txt
- for /f %%s in ('type "ID.TXT" ^|find "在系统上找不到任何设备"') do (goto END)
- ::======================通过ID匹配驱动安装驱动======================
- (
- (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
- if "%%b"=="" (
- set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
- echo;
- set /p "=type "%%%%i"|findstr /c:"%%a">nul&&echo "%%%%i" >>install.txt&&goto :id!nn!"<nul
- echo;
- set /p "=)"<nul
- echo;
- ) else if "%%a"=="实例" (
- set /a n+=1
- set /a nn=!n!+1
- echo :id!n!
- ) else (
- set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
- echo;
- set /p "=type "%%%%i"|findstr /c:"%%b">nul&&echo "%%%%i" >>install.txt&&goto :id!nn!"<nul
- echo;
- set /p "=)"<nul
- echo;
- )
- ))
- set /a n+=1
- echo :id!n!
- )>ids.bat
- call ids.bat
-
- (for /f %%i in (install.txt) do (
- start /min "" "%SystemRoot%\system32\pnputil.exe" /add-driver %%i /install
- ))
- if exist install.txt del install.txt
- ::刷新硬件列表更新硬件状态
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
-
- cls
- ECHO,1> NO1.DLL
- ::======================再次检测是否有硬件没有打上驱动======================
- if exist NO1.DLL (del NO1.DLL && call :run)
- ::=============================清理战场=============================
- :END
- IF EXIST INSTALL.TXT DEL INSTALL.TXT
- IF EXIST ID.TXT DEL ID.TXT
- IF EXIST INF.TXT DEL INF.TXT
- IF EXIST IDS.BAT DEL IDS.BAT
- IF EXIST NO1.DLL DEL NO1.DLL
-
- exit
复制代码
修改后的版本,边匹配边安装,感觉速度更快:- @echo off
- cd /d "%~dp0"
- mode con cols=50 lines=20
- setlocal enabledelayedexpansion
-
- ::禁用指定ID的RAID硬件,并刷新硬件列表。
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_88821043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_467F&SUBSYS_00008086&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /disable-device "PCI\VEN_8086&DEV_A77F&SUBSYS_86941043&REV_00\3&11583659&0&70"
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- cls
- ::=========================提取驱动文件=========================
- 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")
- 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")
- (for /f "tokens=* delims=, " %%b in ('dir /a /s /b .\Public\*.inf ') do echo %%b)>>"inf.txt"
- ::========================提取驱动ID信息=========================
- :run
- pnputil /enum-devices /problem 28 /ids >.\ID.txt
- for /f %%s in ('type "ID.TXT" ^|find "在系统上找不到任何设备"') do (goto END)
- ::======================通过ID匹配驱动安装驱动======================
- (
- (for /f "tokens=1,3 delims= " %%a in ('findstr "\\" "ID.txt"') do (
- if "%%b"=="" (
- set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
- echo;
- set /p "=type "%%%%i"|findstr /c:"%%a">nul&&start /min "" "%SystemRoot%\system32\pnputil.exe" /add-driver "%%%%i" /install&&goto :id!nn!"<nul
- echo;
- set /p "=)"<nul
- echo;
- ) else if "%%a"=="实例" (
- set /a n+=1
- set /a nn=!n!+1
- echo :id!n!
- ) else (
- set /p "=for /f "delims=" %%%%i in (inf.txt) do ("<nul
- echo;
- set /p "=type "%%%%i"|findstr /c:"%%b">nul&&start /min "" "%SystemRoot%\system32\pnputil.exe" /add-driver "%%%%i" /install&&goto :id!nn!"<nul
- echo;
- set /p "=)"<nul
- echo;
- )
- ))
- set /a n+=1
- echo :id!n!
- )>ids.bat
- call ids.bat
-
- ::刷新硬件列表更新硬件状态
- call "%SystemRoot%\system32\pnputil.exe" /scan-devices
- cls
- ECHO,1> NO1.DLL
- ::======================再次检测是否有硬件没有打上驱动======================
- if exist NO1.DLL (del NO1.DLL && call :run)
- ::=============================清理战场=============================
- :END
- IF EXIST INSTALL.TXT DEL INSTALL.TXT
- IF EXIST ID.TXT DEL ID.TXT
- IF EXIST INF.TXT DEL INF.TXT
- IF EXIST IDS.BAT DEL IDS.BAT
- IF EXIST NO1.DLL DEL NO1.DLL
-
- exit
复制代码
作者: licunwei 时间: 2024-1-13 13:44
回复 21# yakeyun
dir /s /b /a-d 更适合我
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |