在CM循环内使用带有管道内容的FOR循环中的IF

时间:2017-02-16 09:04:30

标签: batch-file if-statement for-loop cmd

我正在编写一个批处理安装程序,我必须在安装过程中检查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命令的组合不起作用。 我该怎么办?

3 个答案:

答案 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是其中一个命令(FORIFREM)的事实有关,这些命令比所有其他命令更早被识别出来。命令解释器CMD,以及管道(|)为任一方初始化新CMD实例的事实。

但有一些选择:

  1. 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.)
    
  2. 使用临时文件:

    1. 读取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"
      
    2. 读取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"
      
  3. 显式环绕另一个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.)
    
  4. 奇怪的发现:

    • 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?