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
)
)
...
想要在 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
)
)
...