我正在编写一个批处理安装程序,我必须在安装过程中检查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
命令的组合不起作用。
我该怎么办?
答案 0 :(得分:3)
请参阅HERE
所以代码可以是
JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2^ EQU 2 ECHO INSIDE IF STATEMENT.)
答案 1 :(得分:3)
显式定义符合管道的可执行文件
时更容易JAVA -version 2>&1 | CMD /C"FOR /F "TOKENS=2 DELIMS=." %A IN ('FIND "VERSION" /I') DO IF %A EQU 8 ( ECHO Java 8 ) ELSE ( ECHO NO Java 8 )"
答案 2 :(得分:1)
不幸的是我无法解释为什么它不起作用(我收到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
- 请参阅his comment;但这不再允许真正的数字整数比较:
JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO (IF 2 == 2 ECHO INSIDE IF STATEMENT.)
当您IF
后面的<{1}}后面的 SPACE ({至少})被^
转义时,命令行意外生效:
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.)
另请参阅这个非常有趣的相关主题:What happens with IF command when I pipe to it?