批处理文件:从第二个输出行错误设置变量 space 输出 "Was Unexpected at this time"

Batch File: Setting Variable from second output line error with space on output "Was Unexpected at this time"

我已经为此奋斗了 2 个小时了。我需要从命令的第二行输出设置一个变量。我在 stackoverfglow 上找到了这段代码:

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

wmic.exe CSPRODUCT GET NAME 的输出是:

Name PowerEdge T610

但是当我 运行 我得到批处理文件时:

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

我试着在所有地方都加上引号。 我正在执行此脚本来检查计算机是否是 VirtualBox o VMware 机器,我的想法是使用该命令的输出设置一个变量,然后将其与 "VirtualBox" 进行比较。但是物理计算机的产品名称带有空格。

谢谢!

我会提供以下方法,因为它将捕获完整的字符串,没有任何可能不需要的尾随 space 个字符:

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

注意:如果您使用 Windows 7,某些输出格式的使用可能会被破坏,因为相关的 .xsl 样式表位于特定于语言的子目录中默认不读取。这个问题可以通过 copying/moving 或创建指向更高一级的所有 .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 and/or VMWare as/if 是必要的。显然,您可以在测试后用您选择的命令替换相应的 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).


这是修改后的 , which is intended to fix the potential Format issue in 如我在上面的第一个示例中所述

@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 行是您放置代码的地方,替换我添加的代码只是为了演示目的。