Пакетный файл: Установка переменной из-за ошибки второй выходной строки с пробелом на выходе "Неожиданно в это время" - PullRequest
0 голосов
/ 19 марта 2020

Я боролся с этим уже 2 часа. Мне нужно установить переменную из вывода второй строки команды. Я нашел этот код здесь в stackoverfglow:

for /f "skip=1delims=" %%a in (
'%SystemRoot%\System32\wbem\wmic.exe CSPRODUCT GET NAME'
) do set sid=%%a&goto next

Вывод для wmi c .exe CSPRODUCT GET NAME:

Name PowerEdge T610

, но когда я запускаю пакетный файл, который я получаю:

>set sid=PowerEdge T610
T610 was unexpected at this time.

Я пытался везде ставить кавычки. Я делаю этот сценарий, чтобы проверить, является ли компьютер VirtualBox или VMware, идея состоит в том, чтобы установить переменную с выводом этой команды, а затем сравнить ее с «VirtualBox». Но у физических компьютеров есть название продукта с пробелами.

СПАСИБО!

1 Ответ

1 голос
/ 19 марта 2020

Я бы предложил следующий метод, поскольку он будет захватывать полную строку без каких-либо потенциально нежелательных символов в конце пробела:

@For /F Tokens^=6Delims^=^" %%G In ('""%__AppDir__%wbem\WMIC.exe" CSProduct Get Name /Format:"MOF" 2>Nul"')Do @Set "SID=%%G"

Примечание. Если вы используете Windows 7, использование некоторых выходных форматов может быть поврежден, , так как соответствующие таблицы стилей .xsl находятся внутри подкаталога языкового спецификации c, который по умолчанию не читается . Эта проблема может быть решена путем копирования / перемещения или создания ссылок на все файлы .xsl на один уровень выше, то есть в каталоге wbem . (см. Потенциальное исправление в нижней части этого ответа)


В качестве альтернативы, вы можете опустить полностью, и вместо определения переменной просто используйте условные операторы:

@("%__AppDir__%wbem\WMIC.exe" CSProduct Where "Name Like '%%VirtualBox%%' Or Name Like '%%VMWare%%'" List Instance /Format:"List" 2>NUL|"%__AppDir__%find.exe" "__">NUL&&(Echo Virtual)||Echo Physical)&Pause

Примечание. В этом примере убедитесь, что вы заменили VirtualBox и / или VMWare как / при необходимости. Очевидно, вы можете заменить соответствующие Echo команды выбранными вами командами после тестирования.


В качестве альтернативы, для фактического процесса, в котором вы нуждаетесь, исходя из ваших комментариев, должно быть также достаточно следующего:

@("%__AppDir__%wbem\WMIC.exe" ComputerSystem Where "Model Like '%%Virtual%%'" Get /Value 2>NUL|"%__AppDir__%find.exe" "=">NUL&&(Echo Virtual)||Echo Physical)&Pause

Это должно поднять Hyper-V автомат, (модель: Virtual Machine) , VMware автомат, (Model:VMware Virtual Platform) и Oracle VM, (модель: VirtualBox) .


Вот модифицированный , который предназначен для исправления потенциала Format проблема в , , как упоминалось в моем первом примере выше :

@Echo Off
Set "XSL=MOF"
For /F "Delims==" %%G In ('"Set SID 2>NUL"')Do Set "%%G="
For /F "EOL=MDelims=" %%G In (
    '""%__AppDir__%wbem\WMIC.exe" OS Get MUILanguages,Version 2>NUL"'
)Do For /F Tokens^=2^,4-5Delims^=.^"^  %%H In ("%%G"
)Do If %%I Equ 6 If %%J Equ 1 (Call :Target "%__APPDIR__%wbem\%%H\%XSL%"
)Else Call :Target "%XSL%"
Set SID 2>NUL&&Pause
GoTo :EOF

:Target
For /F Tokens^=6Delims^=^" %%G In (
    '""%__AppDir__%wbem\WMIC.exe" CSProduct Get Name /Format:"%~1" 2>Nul"'
)Do Set "SID=%%G"

Строка 9 - это место, где вы разместите код, заменяющий мой, который был добавлен только для демонстрационных целей.

...