通过 pnputil 安装驱动程序

问题描述 投票:0回答:5

我正在尝试通过 NSIS 安装 .inf 文件,例如(在 NSIS 脚本中安装驱动程序)。

安装本身运行顺利,但 Windows 会使用其内部 发布名称(递增的数字 oemxxx.inf)安装驱动程序。

如何让 pnputil.exe 将发布的名称作为返回值(供以后使用)?

windows driver nsis inf
5个回答
3
投票

我为在 nsis 中获取已发布的驱动程序名称所做的就是这个地狱般的解决方法:

  1. 通过
    pnputil /e > driverlist_before.txt
  2. 将已安装驱动程序列表放入文本文件
  3. 通过
    pnputil /i /a mydriver.inf
  4. 安装新驱动程序
  5. 通过
    pnputil /e > driverlist_after.txt
  6. 将已安装驱动程序列表放入文本文件
  7. 将以下代码放入 .cmd 文件中并通过
    nsExec
  8. 执行它

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%

这个脚本肯定可以优化,欢迎大家提出意见。


1
投票

我认为这是不可能的。以下是 PnPUtil 所有命令的列表:

微软即插即用实用程序

用途:

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 :(


1
投票

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 类名:打印机 类别描述:打印机 类 GUID :{4D36E979-E325-11CE-BFC1-08002BE10318} 日期 : 9/14/2015 版本: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 : 

....也许还有很多其他人


0
投票

我知道这是一个老问题,但也许这个答案对某人仍然有用...... 我用的就是这个:

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 到无穷大)。


0
投票

因此,对于另一种选择,您可以在驱动程序存储区的注册表中查找...

HKEY_LOCAL_MACHINE\SYSTEM\DriverDatabase\DriverPackages\

您必须查看此列表,但您可以找到您的驱动程序,并且带有您的驱动程序名称的键的默认值将具有您可以用来传递给 pnp util 的 oemX.inf 值。

© www.soinside.com 2019 - 2024. All rights reserved.