通过 pnputil 安装驱动程序
Installing a driver via pnputil
我正在尝试通过 NSIS 安装 .inf 文件,例如 (Installing a driver in NSIS script)。
安装本身很顺利,但是 Windows 使用其内部 发布名称 安装驱动程序(递增数字 oemxxx.inf)。
如何让 pnputil.exe 给我发布的名称作为 return 值(供以后使用)?
我认为这不可能。以下是 PnPUtil 所有命令的列表:
Microsoft PnP 实用程序
用法:
pnputil.exe [-f | -一世] [ -? | -a | -d | -e]
示例:
pnputil.exe -a a:\usbcam\USBCAM.INF -> 添加USBCAM.INF
指定的包
pnputil.exe -a c:\drivers*.inf -> 添加 c:\drivers\
中的所有包
pnputil.exe -i -a a:\usbcam\USBCAM.INF -> 添加安装驱动包
pnputil.exe -e -> 枚举所有第 3 方包
pnputil.exe -d oem0.inf -> 删除包 oem0.inf
pnputil.exe -f -d oem0.inf -> 强制删除包 oem0.inf
pnputil.exe -? -> 此用法屏幕
因此您无法提取该信息并将其轻松传递给 NSIS :(
我为在 nsis 中获取已发布的驱动程序名称所做的是一个非常好的解决方法:
- 通过
pnputil /e > driverlist_before.txt
将已安装的驱动程序列表放入文本文件
- 通过
pnputil /i /a mydriver.inf
安装新的驱动程序
- 通过
pnputil /e > driverlist_after.txt
将已安装的驱动程序列表放入文本文件
- 将以下代码放入.cmd文件中并通过
nsExec
执行
GetPublishedDrivername.cmd
的内容
@echo off
:: look at differences between files and just keep the line with the oem info
fc mydriverlist_before.txt mydriverlist_after.txt | findstr /C:"oem" > diff.txt
:: cut result and keep second part " oem##.inf"
for /f "tokens1,2 delims=:" %%a in (diff.txt) do (
if "%%a"=="Published name " set info=%%b
)
:: get rid of leading spaces "oem##.inf"
for /f "tokens=* delims= " %%a in ("%info%") do set info=%%a
:: split "oem##.inf" and keep first part "oem##"
for /f "tokens=1,2 delims=." %%a in ("%info%") do set info=%%a
:: get of the oem part "##"
set info=%info:oem=%
:: convert string into int value
set /a info=%info%
del diff.txt
:: return number as result
exit /b %info%
这个脚本肯定可以优化,欢迎大家输入。
Pnputil 不会执行此操作,但您可以通过执行
获取有关 oem(number).inf 文件的详细信息
dism /online /get-driverinfo /driver:oem(number).inf
您将得到如下列表:
部署映像服务和管理工具
版本:10.0.14393.0
图片版本:10.0.14393.0
驱动包信息:
发布名称:oem3.inf
驱动程序存储路径:C:\Windows\System32\DriverStore\FileRepository\us003.inf_amd64_daf71ec003559d2a\us003.inf
Class 名称:打印机
Class 描述:打印机
Class GUID:{4D36E979-E325-11CE-BFC1-08002BE10318}
日期:2015 年 9 月 14 日
版本:3.0.3.0
启动关键:否
架构驱动程序:x86
Manufacturer : Samsung
Description : Samsung Universal Print Driver 3
Architecture : x86
Hardware ID : USBPRINT\SamsungML-21500EDE
Service Name :
Compatible IDs :
Exclude IDs :
Manufacturer : Samsung
Description : Samsung Universal Print Driver 3
Architecture : x86
Hardware ID : WSDPRINT\SamsungML-21500EDE
Service Name :
Compatible IDs :
Exclude IDs :
Manufacturer : Samsung
Description : Samsung Universal Print Driver 3
Architecture : x86
Hardware ID : USBPRINT\SamsungSCX-6x45_Seri402B
Service Name :
Compatible IDs :
Exclude IDs :
.. 可能还有很多其他人
我知道这是一个老问题,但也许这个答案对某些人仍然有用...
这是我使用的:
SET OEMNUM=-1
FOR /L %%G IN (1,1,200) DO (
dism /online /get-driverinfo /driver:oem%%G.inf >temp.txt
find "something.inf" temp.txt >nul && SET OEMNUM=%%G
)
pnputil /delete-driver oem%oemnum%.inf /force
基本上它会检查每个 OEM# 的详细信息,直到找到您要查找的 INF,然后使用 pnputil 将其删除。
如果不存在,pnputil 将尝试删除 "oem-1.inf",它不存在(从 0 到无穷大)。
我正在尝试通过 NSIS 安装 .inf 文件,例如 (Installing a driver in NSIS script)。
安装本身很顺利,但是 Windows 使用其内部 发布名称 安装驱动程序(递增数字 oemxxx.inf)。
如何让 pnputil.exe 给我发布的名称作为 return 值(供以后使用)?
我认为这不可能。以下是 PnPUtil 所有命令的列表:
Microsoft PnP 实用程序
用法:
pnputil.exe [-f | -一世] [ -? | -a | -d | -e]
示例:
pnputil.exe -a a:\usbcam\USBCAM.INF -> 添加USBCAM.INF
指定的包pnputil.exe -a c:\drivers*.inf -> 添加 c:\drivers\
中的所有包pnputil.exe -i -a a:\usbcam\USBCAM.INF -> 添加安装驱动包
pnputil.exe -e -> 枚举所有第 3 方包
pnputil.exe -d oem0.inf -> 删除包 oem0.inf
pnputil.exe -f -d oem0.inf -> 强制删除包 oem0.inf
pnputil.exe -? -> 此用法屏幕
因此您无法提取该信息并将其轻松传递给 NSIS :(
我为在 nsis 中获取已发布的驱动程序名称所做的是一个非常好的解决方法:
- 通过
pnputil /e > driverlist_before.txt
将已安装的驱动程序列表放入文本文件
- 通过
pnputil /i /a mydriver.inf
安装新的驱动程序
- 通过
pnputil /e > driverlist_after.txt
将已安装的驱动程序列表放入文本文件
- 将以下代码放入.cmd文件中并通过
nsExec
执行
GetPublishedDrivername.cmd
@echo off
:: look at differences between files and just keep the line with the oem info
fc mydriverlist_before.txt mydriverlist_after.txt | findstr /C:"oem" > diff.txt
:: cut result and keep second part " oem##.inf"
for /f "tokens1,2 delims=:" %%a in (diff.txt) do (
if "%%a"=="Published name " set info=%%b
)
:: get rid of leading spaces "oem##.inf"
for /f "tokens=* delims= " %%a in ("%info%") do set info=%%a
:: split "oem##.inf" and keep first part "oem##"
for /f "tokens=1,2 delims=." %%a in ("%info%") do set info=%%a
:: get of the oem part "##"
set info=%info:oem=%
:: convert string into int value
set /a info=%info%
del diff.txt
:: return number as result
exit /b %info%
这个脚本肯定可以优化,欢迎大家输入。
Pnputil 不会执行此操作,但您可以通过执行
获取有关 oem(number).inf 文件的详细信息 dism /online /get-driverinfo /driver:oem(number).inf
您将得到如下列表:
部署映像服务和管理工具 版本:10.0.14393.0
图片版本:10.0.14393.0
驱动包信息:
发布名称:oem3.inf 驱动程序存储路径:C:\Windows\System32\DriverStore\FileRepository\us003.inf_amd64_daf71ec003559d2a\us003.inf Class 名称:打印机 Class 描述:打印机 Class GUID:{4D36E979-E325-11CE-BFC1-08002BE10318} 日期:2015 年 9 月 14 日 版本:3.0.3.0 启动关键:否
架构驱动程序:x86
Manufacturer : Samsung
Description : Samsung Universal Print Driver 3
Architecture : x86
Hardware ID : USBPRINT\SamsungML-21500EDE
Service Name :
Compatible IDs :
Exclude IDs :
Manufacturer : Samsung
Description : Samsung Universal Print Driver 3
Architecture : x86
Hardware ID : WSDPRINT\SamsungML-21500EDE
Service Name :
Compatible IDs :
Exclude IDs :
Manufacturer : Samsung
Description : Samsung Universal Print Driver 3
Architecture : x86
Hardware ID : USBPRINT\SamsungSCX-6x45_Seri402B
Service Name :
Compatible IDs :
Exclude IDs :
.. 可能还有很多其他人
我知道这是一个老问题,但也许这个答案对某些人仍然有用... 这是我使用的:
SET OEMNUM=-1
FOR /L %%G IN (1,1,200) DO (
dism /online /get-driverinfo /driver:oem%%G.inf >temp.txt
find "something.inf" temp.txt >nul && SET OEMNUM=%%G
)
pnputil /delete-driver oem%oemnum%.inf /force
基本上它会检查每个 OEM# 的详细信息,直到找到您要查找的 INF,然后使用 pnputil 将其删除。 如果不存在,pnputil 将尝试删除 "oem-1.inf",它不存在(从 0 到无穷大)。