Script de morcego usando o WMIC causando problemas

0

Estou tentando escrever um script para instalar o driver de exibição correto. Para encurtar a história em sistemas mais recentes, quando você adiciona uma placa dedicada, a placa não está mais desativada, portanto, quando eu executo este comando:

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

minha variável vdcd agora está configurada com o pnpdeviceid do onboard, mas quando eu adiciono o wmic Onde verb eu não obtenho nenhum resultado usando este comando:

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

Rodando apenas

wmic path win32_videocontroller Where DeviceID="VideoController1" get pnpdeviceid

resulta com o adaptador de exibição primário desejado. Eu posso fazer uma bagunça das coisas e "fazer" o trabalho, mas eu gostaria de manter meus scripts tão limpos quanto possível .. Fazendo o trabalho, escrevendo o comando simples para um arquivo txt e, em seguida, executando um comando separado para ler o documento txt .

Um usuário em outro site sugeriu que eu tentasse isso como uma solução alternativa

@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

mas recebo uma saída disso

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

ECHO is off.

Press any key to continue . . .

por algum motivo no do set x=%%a ele está ecoando set x=%%a e não está definindo um valor ... muito estranho mesmo ...

Alguma idéia (além de "usar um idioma diferente", que também foi sugerido)?

    
por urlocalguru 19.02.2013 / 05:47

2 respostas

1

Seu problema deriva de peculiaridades de como o CMD (batch) analisa seu código. O comando dentro da cláusula FOR IN () é analisado duas vezes, e o analisador acaba convertendo o = em um espaço, a menos que seja escapado ou citado.

Aqui está uma solução usando 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


Aqui está uma solução usando aspas:

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


É realmente possível usar aspas ao redor do comando inteiro e eliminar todas as fugas:

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

Citar e escapar em lote pode ficar confuso muito rapidamente, mas acredite, realmente existem regras e é totalmente previsível :-) Isso pode não parecer assim.

    
por 20.02.2013 / 03:19
0

A posição do seu >nul é o problema. find não encontrará nada porque você está direcionando a saída do comando para nul . Se você simplesmente não quer que ele exiba a saída, você tem que redirecionar o comando find para nul , pois é o que está exibindo para 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
    
por 23.02.2013 / 19:40