Я пытаюсь написать скрипт для установки правильного драйвера дисплея. Короче говоря, о новых системах, когда вы добавляете выделенную карту, встроенная плата больше не отключается, поэтому, когда я запускаю эту команду:

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

действительно с нужным адаптером основного дисплея. Я могу все испортить и "СДЕЛАТЬ" это работает, но мне нравится, чтобы мои скрипты были как можно более чистыми. Чтобы заставить его работать, нужно записать простую команду в текстовый файл, а затем запустить отдельную команду for для чтения текстового документа.

Пользователь на другом сайте предложил мне попробовать это в качестве обходного пути

@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 и вообще не устанавливает значение ... очень странно ...

Любые идеи (кроме "использовать другой язык", который также был предложен)?

2 ответа2

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

Цитирование и экранирование в пакетном режиме могут очень быстро запутать, но, поверьте мне, действительно есть правила, и это абсолютно предсказуемо :-) Может показаться, что это не так.

0

Положение вашего >nul является проблемой. find не найдет ничего, потому что вы направляете вывод команды на nul . Если вы просто не хотите, чтобы он отображал выходные данные, вы должны перенаправить команду find на nul как она отображается на

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .