WMIC批量输出。如何清除腐败?

时间:2017-06-13 19:49:08

标签: batch-file wmic

想要检测程序是否在VirtualBox中运行。

@echo off
setlocal enabledelayedexpansion
set count=0
for /f "tokens=1 delims==" %%a in ('wmic csproduct get name') do (
  set name!count!=%%a
  set /a count=!count!+1
)
if /i not !name1!==virtualbox (
echo NOT VIRTUALBOX
echo !name1!
) else (
echo VIRTUALBOX
echo !name1!
)
endlocal

但是!name1!字符串已损坏。通过在echo !name1!之后添加文本,变量!name1!被添加的文本吃掉,文字出现在字符串之前。无法执行if与此类字符串进行比较。有什么建议吗?

1 个答案:

答案 0 :(得分:3)

绕过另一个for /F循环:

...
for /F "delims=" %%a in ('wmic CSProduct get Name') do (
    for /F "tokens=1 delims==" %%b in ("%%a") do (
        set "name!count!=%%b"
        set /A count+=1
    )
)
...

问题是wmic产生了Unicode输出,for /F没有正确转换为ANSI文本,它留下了一些假象(孤立的回车符);第二个for /F循环删除它们。

命令行wmic CSProduct get Name产生如下输出:

Name
VirtualBox

因此,您可以将skip=1选项添加到外部for /F循环,以便不处理标头。此外,内部tokens=1 delims==循环的选项字符串for /F没有意义,因为无论如何都不应出现任何=

...
for /F "skip=1 delims=" %%a in ('wmic CSProduct get Name') do (
    for /F "delims=" %%b in ("%%a") do (
        set "name!count!=%%b"
        set /A count+=1
    )
)
...

或者,您可以将/VALUE选项添加到wmic命令行以获得如下输出:

Name=VirtualBox

在这种情况下,代码需要像这样调整:

...
for /F "delims=" %%a in ('wmic CSProduct get Name /VALUE') do (
    for /F "tokens=1* delims==" %%b in ("%%a") do (
        set "name!count!=%%c"
        set /A count+=1
    )
)
...