将批处理命令的输出重定向到if语句(和字符串错误?)

时间:2011-11-11 20:15:38

标签: batch-file

经过一些研究后,我发现了获得批处理命令输出并将其设置为变量的好处。我从博客中使用了一点example code:Just Geeks开始。我最终的目标是检测脚本运行的计算机模型,并根据哪个模型执行某些操作。经过一些修改后我得到了:

FOR /F "tokens=* skip=1 delims=" %%A in ('wmic csproduct get name') do ( 
if %%A == "Vostro 430" goto vostro430
if %%A == "Optiplex 380" goto optiplex380
)
exit

:vostro430
REM do some stuff here

:optiplex380
REM do some stuff here

有用的是要注意wmic csproduct获取名称> Vostro 430(戴尔计算机型号)上的sometextfile.txt文本文件如下所示:

Name
Vostro 430

所以上面的代码"应该"忽略第一行并比较" Vostro 430"在if语句中然后跳转到其中一个标签。似乎我有一些错误,但如果我回应批处理脚本,我可以看到它正在评估%A作为空白:

== "Vostro 430" goto vostro430
== "Optiplex 380" goto optiplex380

我弄乱了什么想法?我怀疑某种字符串或语法问题,但我还没能把它固定下来。

3 个答案:

答案 0 :(得分:1)

尝试在%%A周围添加引号...就像这样:

if "%%A" == "Vostro 430" goto vostro430
if "%%A" == "Optiplex 380" goto optiplex380

答案 1 :(得分:1)

for /F命令中获取整行的标准方法是通过tokens = *或delims =“,但不是两者。仅使用这种方式:

FOR /F "skip=1 delims=" %%A in ('wmic csproduct get name') do ( ...

此外,您必须在%%A中添加引号,以便在if命令中进行正确比较,正如aphoria所说。

答案 2 :(得分:1)

由于情绪指向,你需要引用%%A

但主要问题是wmic命令的输出, 因为它以unicode格式输出。

尝试使用此代码查看效果

FOR /F "tokens=* skip=1 delims=" %%A in ('wmic csproduct get name') do ( 
    echo .............1%%A2
)

输出类似于

2............1TravelMate 7720
2............1

这里发生了什么?这些行附加了<CR>字符,因此2将在该行的第1位打印。

只需从%%A

中删除最后一个字符即可避免这种情况
setlocal EnableDelayedExpansion
FOR /F "tokens=* skip=1 delims=" %%A in ('wmic csproduct get name') do ( 
    set "line=%%A"
    set "line=!line:~0,-1!"
    echo "!line!"
)

或者您使用TYPE命令来规范化输出

wmic csproduct get name > wmicOutput.tmp
FOR /F "tokens=* skip=1 delims=" %%A in ('type wmicOutput.tmp') do ( 
    echo Works too "%%A"
    if "%%A"== "Vostro 430" goto :Vostro
)