Я бы предложил следующий метод, поскольку он будет захватывать полную строку без каких-либо потенциально нежелательных символов в конце пробела:
@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
. (см. Потенциальное исправление в нижней части этого ответа)
В качестве альтернативы, вы можете опустить for-l oop полностью, и вместо определения переменной просто используйте условные операторы:
@("%__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
проблема в windows -7 , , как упоминалось в моем первом примере выше :
@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
- это место, где вы разместите код, заменяющий мой, который был добавлен только для демонстрационных целей.