pnputil.exe未被识别为内部或外部命令

5
当我通过命令提示符执行安装驱动程序的命令时:
cd C:\Windows\System32
pnputil.exe -i -a "C:\Users\Desktop\Drivers\IPEnabled_001.inf"

它可以正常工作。

But if i execute the command in Installanywhere tool 
It showing the error message:
pnputil.exe is not recognized as an internal or external command

请问您能告诉我为什么会显示错误信息以及如何解决这个问题吗? 非常感谢。

请还建议一种替代方法来安装inf驱动程序。


5
这很可能是因为你正在64位安装的Windows上执行此操作,而安装程序正在作为32位进程运行。pnputil.exe只有64位版本,所以你需要运行%windir%\sysnative\pnputil.exe。请勿在XP上尝试。 - Hans Passant
谢谢Hans Passant,它有效。 - deepaksharma
1个回答

9

pnputil.exe只有64位应用程序可用,这意味着有%SystemRoot%\System32\pnputil.exe(x64),但没有%SystemRoot%\SysWOW64\pnputil.exe(x86)。

在使用cd C:\Windows\System32命令时,当前目录取决于启动Windows命令解释器cmd.exe的应用程序的体系结构。64位应用程序实际上启动%SystemRoot%\System32\cmd.exe,但32位应用程序会启动%SystemRoot%\SysWOW64\cmd.exe。原因是Windows 文件系统重定向,对于x86应用程序,将任何文件访问重定向到Windows x64上的目录%SystemRoot%\SysWOW64中的%SystemRoot%\System32

在运行此任务之前,最好检查该文件的存在性,pnputil.exe 仅存在于 %SystemRoot%\System32 目录中,不受 Windows 架构的限制。

if exist %SystemRoot%\System32\pnputil.exe (
    set "SystemPath=%SystemRoot%\System32"
) else if exist %SystemRoot%\Sysnative\pnputil.exe (
    set "SystemPath=%SystemRoot%\Sysnative"
) else (
    echo ERROR: Cannot find pnputil.exe to install the driver.
    echo/
    pause
    goto :EOF
)
%SystemPath%\pnputil.exe -i -a "%USERPROFILE%\Desktop\Drivers\IPEnabled_001.inf"

第一个IF条件适用于32位Windows上的32位应用程序和64位Windows上的64位应用程序。
第二个IF条件适用于64位Windows上的32位应用程序。 Sysnative是Windows x64上x86应用程序的特殊重定向器。对于x64应用程序,Sysnative不存在。 Sysnative不是目录、符号链接或硬链接。因此,不可能使用if exist %SystemRoot%\Sysnative,因为此条件永远不会成立。需要检查重定向目录中是否存在文件,例如使用if exist %SystemRoot%\Sysnative\*,这仅对在64位Windows上运行当前32位cmd.exe的情况成立。
最终的ELSE分支适用于例如没有pnputil.exe的Windows XP。
然而,不建议使用pnputil.exe来安装驱动程序。微软免费发布了Driver Package Installer DPInst。有32位(dpinst32.exe)和64位版本(dpinst64.exe)。使用驱动程序包安装程序非常容易安装一个或多个驱动程序。
让我们看看像英特尔®这样提供适当驱动程序的硬件制造公司如何使用Driver Package Installer安装驱动程序。
驱动程序安装程序包通常具有以下目录结构:
  • VISTA32
  • VISTA64
  • WIN7-x86
  • WIN7-x64
  • XPx86
  • XPx64
或者像下面这样的目录结构:
  • VISTA
    • x86
    • x64
  • WIN7
    • x86
    • x64
  • XP
    • x86
    • x64
安装程序包的目录结构因安装程序包而异,但这并不重要,通常很容易看出哪个目录中的驱动程序文件适用于哪个Windows版本,包括体系结构。此外,还有dpinst32.exe和dpinst64.exe,它们可以存储在所有包含驱动程序文件的子目录的父目录中,或者直接存储在包含驱动程序文件的目录中的两个驱动程序目录中之一。让我们将驱动程序安装示例简单化,假设包中只有两个驱动程序文件,一个适用于Windows x86,另一个适用于Windows x64。
  • WIN-32
    • dpinst32.exe
    • *.cat
    • *.dll
    • *.inf
    • *.sys
  • WIN-64
    • dpinst64.exe
    • *.cat
    • *.dll
    • *.inf
    • *.sys
在32位Windows中,使用简单的批处理文件安装32位驱动程序(s)的代码为WIN-32,在64位Windows上安装64位驱动程序(s)的代码为WIN-64,可以由32位或64位cmd.exe执行。
set "WINARCH=64"
if "%ProgramFiles(x86)%" == "" set "WINARCH=32"
cd WIN-%WINARCH%
dpinst%WINARCH%.exe

环境变量 ProgramFiles(x86) 只存在于 Windows x64 上,这使得确定 Windows 架构非常容易,详见WOW64 Implementation Details。处理器架构并不重要,因为在配备 AMD 64 位(兼容)处理器的 PC 上,仍然可以安装 32 位 Windows。 dpinst32.exedpinst64.exe 在没有任何选项的情况下启动,将在当前目录中找到的所有驱动程序都安装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接