使用 WMIC 的 Bat 脚本导致问题

使用 WMIC 的 Bat 脚本导致问题

我正在尝试编写一个脚本来安装正确的显示驱动程序。长话短说,在较新的系统上,当您添加专用卡时,板载卡不再被禁用,因此当我运行此命令时:

FOR /F "tokens=2 delims==" %%i IN ('wmic path win32_videocontroller get pnpdeviceid/value 2^>NUL ^| find /i "pnpdeviceid"') DO set vdcd=%%i

我的 vdcd 变量现在已使用板载的 pnpdeviceid 进行设置,但是当我添加 wmic Where 动词时,使用此命令没有得到任何结果:

FOR /F "tokens=2 delims==" %%i IN ('wmic path win32_videocontroller Where DeviceID="VideoController1" get pnpdeviceid /value 2^>NUL ^| find /i "pnpdeviceid"') DO set vdcd=%%i

跑步只是

wmic path win32_videocontroller Where DeviceID="VideoController1" get pnpdeviceid

确实会产生所需的主显示适配器。我可以把事情弄得一团糟,然后“使”它工作,但我希望我的脚本尽可能干净。通过将简单的命令写入 txt 文件,然后运行单独的 for 命令来读取 txt 文档,使其工作。

另一个网站上的用户建议我尝试这个解决方法

@echo off
wmic path win32_videocontroller get deviceid, pnpdeviceid | for /f "tokens=2" %%a in ('find /i "videocontroller1"') do set x=%%a
echo %x% 
pause

但我得到了这个输出

G:\Drivers\Display>set x=PCI\VEN_10DE&DEV_104A&SUBSYS_35451458&REV_A1\4&14466D94
&0&0008

ECHO is off.

Press any key to continue . . .

由于某种原因,do set x=%%a它反而回显set x=%%a而根本没有设置值......确实非常奇怪......

有什么想法吗(除了“使用不同的语言”,这也被建议了)?

答案1

您的问题源于 CMD(批处理)解析代码的特殊性。 FOR IN() 子句中的命令被解析两次,并且解析器最终会将其转换=为空格,除非对其进行转义或引用。

以下是使用 escape 的解决方案:

FOR /F "tokens=2 delims==" %%i IN ('wmic path win32_videocontroller Where DeviceID^="VideoController1" get pnpdeviceid /value 2^>NUL ^| find /i "pnpdeviceid"') DO set vdcd=%%i


以下是使用引号的解决方案:

FOR /F "tokens=2 delims==" %%i IN ('wmic path win32_videocontroller Where "DeviceID='VideoController1'" get pnpdeviceid /value 2^>NUL ^| find /i "pnpdeviceid"') DO set vdcd=%%i


实际上可以使用引号括住整个命令并消除所有转义:

FOR /F "tokens=2 delims==" %%i IN ('"wmic path win32_videocontroller Where DeviceID='VideoController1' get pnpdeviceid /value 2>NUL | find /i "pnpdeviceid""') DO set vdcd=%%i

批量引用和转义很快就会让人感到困惑,但是相信我,确实有规则,而且完全可以预测:-) 只是看起来可能并非如此。

答案2

>nul问题出在 你的位置。find找不到任何东西,因为你将命令的输出定向到nul。如果你只是不想让它显示输出,你必须将命令重定向find到,nul因为它是显示到 con 的内容

FOR /F "tokens=2 delims==" %%i IN ('wmic path win32_videocontroller Where DeviceID="VideoController1" get pnpdeviceid /value 2 ^| find /i "pnpdeviceid"^>NUL') DO set vdcd=%%i

相关内容