Batch file 批处理文件:设置来自第二个输出行的变量错误,输出上有空格;在这个时候是出人意料的”;
我已经为此奋斗了两个小时了。我需要从命令的第二行输出设置一个变量。我在stackoverfglow找到了以下代码:Batch file 批处理文件:设置来自第二个输出行的变量错误,输出上有空格;在这个时候是出人意料的”;,batch-file,variables,wmic,for-loop,windows-7,Batch File,Variables,Wmic,For Loop,Windows 7,我已经为此奋斗了两个小时了。我需要从命令的第二行输出设置一个变量。我在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的输出为: 名称 PowerEdge T610 但当我运行批处理文件时,我得到: >
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的输出为:
名称
PowerEdge T610
但当我运行批处理文件时,我得到:
>set sid=PowerEdge T610
T610 was unexpected at this time.
我试着到处引用。
我编写这个脚本是为了检查这台计算机是否是VirtualBox o VMware机器,目的是用该命令的输出设置一个变量,然后将其与“VirtualBox”进行比较。但物理计算机的产品名称中有空格
谢谢 我将提供以下方法,因为它将捕获完整字符串,而不包含任何可能不需要的尾随空格字符:
@For/F Tokens^=6Delims^=^“%%G In(“%”“%\uuuuu AppDir\uuuuuuu%wbem\WMIC.exe”CSProduct Get Name/Format:“MOF”2>Nul“)Do@Set“SID=%%G”
注意:如果您使用的是Windows 7
,则某些输出格式的使用可能会中断,因为相关的.xsl
样式表位于特定于语言的子目录中,默认情况下不会读取该子目录。通过复制/移动或创建指向所有.xsl
文件的链接,可以解决此问题,也就是说,在wbem
目录中。(参见本答案底部的潜在替代修复)
或者,您可以完全省略,而不是定义变量,只使用条件语句:
@(“%\uuuuu-AppDir\uuuuu%wbem\WMIC.exe”CSProduct其中“名称类似于“%%VirtualBox%%”或名称类似于“%%VMWare%%”的列表实例/格式:“列表”2>NUL |“%\uuuuuu-AppDir\uuuuuu%find.exe”\uuuuuu“>NUL&(Echo-Virtual)| Echo-Physical)&暂停
注意:在此示例中,请确保在必要时替换VirtualBox
和/或VMWare
。显然,您可以在测试后使用所选的命令替换相应的Echo
命令
或者,对于您需要它的实际过程,根据您的评论,以下内容也应足够:
@(“%\uuuuu AppDir\uuuuu%wbem\WMIC.exe”计算机系统,其中“类似于%%Virtual%%”的模型”获取/Value 2>NUL |“%\uuuuuu AppDir\uuuuu%find.exe”“=”>NUL&&(Echo Virtual)| Echo Physical)&Pause
这应该包括一台Hyper-V
机器(型号:Virtual machine
)、一台VMware
机器(Model:VMware Virtual Platform
)和一台Oracle虚拟机(型号:VirtualBox
)
下面是一个修改后的,旨在修复中潜在的格式
问题,如我在上面的第一个示例中所述:
@Echo关闭
设置“XSL=MOF”
对于/F“Delims=”(“'Set SID 2>NUL')中的%%G,请设置“%%G=”
对于/F“EOL=MDelims=“%%G In(
““%%\uuuuuu AppDir\uuuuuu%wbem\WMIC.exe”操作系统获取MUILanguages,版本2>NUL”
)Do For/F代币^=2^,4-5Delims^=.^“^%%H In(“%%G”
)如果%%I eq 6 If%%J eq 1(调用:目标“%\uuuuu APPDIR\uuuuuu%wbem\%H\%XSL%”则执行此操作
)Else调用:目标“%XSL%”
设置SID 2>NUL&&Pause
后藤:EOF
:目标
对于/F令牌^=6Delims^=^“%%G In(
“%”“%\uuuuu AppDir\uuuu%wbem\WMIC.exe”CSProduct Get Name/格式:“%~1”2>Nul”
)不设置“SID=%%G”
行9
是您放置代码的地方,它取代了我的代码,我的代码只是为了演示而添加的。感谢您的超级快速回复。您的命令将把SID设置为“G”。这是批处理文件的输出:B:\Projects\Done\Health\VirtualBox Tools Check>for/F Tokens=6Delims=“%G In('””C:\Windows\system32\wbem\WMIC.exe“CSProduct Get Name/Format:“MOF”2>Nul“')Do@Set“SID=G“B:\Projects\Done\Health\VirtualBox Tools Check>echo G
@deftoner-该命令应以%%G
而不是%G
结尾。我已修复了我的打字错误,对于给您带来的不便,我深表歉意。”。我还添加了另一种方法,它不需要在Windows 7中使用、定义变量或处理潜在的WMIC格式问题。我发现参数/格式:“MOF”不起作用。如果没有它,将可以完美地工作:@For/F令牌^=6Delims^=^“%%G In('''''''''''''''''''''''''''%''''.'应用程序目录'.''wbem\WMIC.exe“CSProduct Get Name 2>Nul'.')Do@Set“SID=%%G”
(在多台计算机上测试)很抱歉,@deftoner,但我看不出该命令如何按照您的要求工作。我还添加了一个可能的未经测试的方法,用于解决/Format
问题。请确保在运行您正在使用的行之前,使用@Set“SID=“
取消任何现有变量值的定义,然后再对其进行测试。