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

WMIC output in batch. How to remove corruption?

想要在 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 比较。有什么建议吗?

环绕另一个 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 文本,它会留下一些人工制品(孤立的 carriage-return 字符);第二个 for /F 循环删除它们。


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

Name
VirtualBox

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

...
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
    )
)
...