想要检测程序是否在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
与此类字符串进行比较。有什么建议吗?
答案 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
)
)
...