我正在编写一个批处理安装程序,并且在安装过程中必须检查java的版本。为此,我在批处理中使用以下代码:
JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
但是由于某种原因这不起作用,会出现以下错误消息:
2 was unexpected at this time.
如果我不管道命令FOR
循环然后IF
执行命令。如果我在管道输送时放在ECHO
外面IF
,并且不使用IF
,ECHO
则会被执行。
因此,出于某种原因,管道和IF
命令的组合不起作用。我应该怎么办?
不幸的是,我无法解释为什么它不起作用(我收到了2 was unexpected at this time.
);但猜测它有事情做的事实,IF
就是命令(FOR
,IF
,REM
)由命令解释看起来比所有其他人早CMD
,与事实管道(一起|
)初始化新的CMD
情况下任何一方。
但是,有一些选择:
将JAVA
命令也放入FOR /F
循环中:
FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`JAVA -version 2^>^&1 ^| FIND "version" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
使用一个临时文件:
在FOR /F
循环中读取临时文件:
JAVA -version > "%TEMP%\file.tmp" 2>&1
FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`^< "%TEMP%\file.tmp" FIND "version" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
DEL "%TEMP%\file.tmp"
在FOR /F
循环外读取临时文件:
JAVA -version > "%TEMP%\file.tmp" 2>&1
< "%TEMP%\file.tmp" (FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "version" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.))
DEL "%TEMP%\file.tmp"
CMD
显式包装另一个实例以从IF
命令中隐藏管道:
JAVA -version 2>&1 | CMD /C FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
奇怪的发现:
史蒂芬(Stephan)发现了另一种解决方法:使用比较运算符==
代替EQU
-参见他的评论;但这不再允许进行真正的数字整数比较:
JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2 == 2 ECHO INSIDE IF STATEMENT.)
当您(至少)转义bySPACE后面IF
的(至少)时^
,命令行意外起作用:
JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF^ 2 EQU 2 ECHO INSIDE IF STATEMENT.)
REM/ ^&
立即插入以下内容IF
:
JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (REM/ ^& IF 2 EQU 2 ECHO INSIDE IF STATEMENT.)
还要看一下这个非常有趣的相关线程:管道传递给IF命令时会发生什么?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句