经过一些研究后,我发现了获得批处理命令输出并将其设置为变量的好处。我从博客中使用了一点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
我弄乱了什么想法?我怀疑某种字符串或语法问题,但我还没能把它固定下来。
答案 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
)