批处理文件:从第二个输出行错误设置变量 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
目录中 . (请参阅此答案底部的潜在替代修复)
或者,您可以完全省略 for-loop,而不是定义变量,只需使用条件语句:
@("%__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
).
这是修改后的 batch-file, which is intended to fix the potential Format
issue in 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
行是您放置代码的地方,替换我添加的代码只是为了演示目的。
我已经为此奋斗了 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
目录中 . (请参阅此答案底部的潜在替代修复)
或者,您可以完全省略 for-loop,而不是定义变量,只需使用条件语句:
@("%__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
).
这是修改后的 batch-file, which is intended to fix the potential Format
issue in 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
行是您放置代码的地方,替换我添加的代码只是为了演示目的。