Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用IF inside FOR循环,并在CMD内使用管道内容_Batch File_If Statement_For Loop_Cmd - Fatal编程技术网

Batch file 使用IF inside FOR循环,并在CMD内使用管道内容

Batch file 使用IF inside FOR循环,并在CMD内使用管道内容,batch-file,if-statement,for-loop,cmd,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.) 但由于某些原因,这不起作用,出现以下错误消息: 如果我没有将命令管道化到FOR循环,则执行If命令。 如果我在配管时将ECHO

我正在编写一个批处理安装程序,在安装过程中我必须检查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.)
但由于某些原因,这不起作用,出现以下错误消息:

如果我没有将命令管道化到
FOR
循环,则执行
If
命令。 如果我在配管时将
ECHO
置于
If
外部,并且不使用
If
ECHO
将被执行

因此,由于某些原因,管道和
IF
命令的组合不起作用。
我该怎么办?

不幸的是,我无法解释为什么它不工作(我收到的
2此时是意外的。
);但我猜这与以下事实有关:
IF
是命令解释器比其他命令更早识别的命令之一(
FOR
IF
REM
),以及管道(
)为任意一方初始化新的
CMD
实例

但也有一些选择:

  • JAVA
    命令也放入
    FOR/F
    循环:

    FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`JAVA-version 2^>^&1^| FIND“version”/I`)DO(IF语句中的IF 2 eq 2 ECHO)
    
  • 使用临时文件:

  • 读取
    FOR/F
    循环中的临时文件:

    JAVA-version>%TEMP%\file.tmp“2>&1
    对于(`^<%TEMP%\file.tmp“FIND”version”/I`)中的/F“USEBACKQ TOKENS=2 DELIMS=。%A执行(IF语句中的IF 2 eq 2 ECHO)
    删除“%TEMP%\file.tmp”
    
  • FOR/F
    循环之外读取临时文件:

    JAVA-version>%TEMP%\file.tmp“2>&1
    <%TEMP%\file.tmp“(对于/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF 2 eq 2 ECHO))
    删除“%TEMP%\file.tmp”
    
  • 显式环绕另一个
    CMD
    实例,以在
    IF
    命令中隐藏管道:

    JAVA-version 2>&1 | CMD/C FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF 2 eq 2 ECHO)
    

  • 奇怪的发现:

    • 找到了另一个解决方法:使用比较运算符
      ==
      而不是
      eq
      ——请参阅;但这不再允许真正的数字-整数比较:

      JAVA-version 2>&1 | FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF 2==2 ECHO。)
      
    • 当您通过
      ^
      转义(至少)紧靠
      IF
      后面的空间时,命令行会意外地工作:

      JAVA-version 2>&1 | FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF^2 eq 2 ECHO。)
      
    • 前面插入
      REM/^&
      ,如果

      JAVA-version 2>&1 | FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(REM/^&IF 2 eq 2 ECHO IN IF语句。)
      


    还可以看看这个非常有趣的相关线程:

    不幸的是,我无法解释为什么它不起作用(我收到的
    2此时是意外的。
    );但我猜这与以下事实有关:
    IF
    是命令解释器比其他命令更早识别的命令之一(
    FOR
    IF
    REM
    ),以及管道(
    )为任意一方初始化新的
    CMD
    实例

    但也有一些选择:

  • JAVA
    命令也放入
    FOR/F
    循环:

    FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`JAVA-version 2^>^&1^| FIND“version”/I`)DO(IF语句中的IF 2 eq 2 ECHO)
    
  • 使用临时文件:

  • 读取
    FOR/F
    循环中的临时文件:

    JAVA-version>%TEMP%\file.tmp“2>&1
    对于(`^<%TEMP%\file.tmp“FIND”version”/I`)中的/F“USEBACKQ TOKENS=2 DELIMS=。%A执行(IF语句中的IF 2 eq 2 ECHO)
    删除“%TEMP%\file.tmp”
    
  • FOR/F
    循环之外读取临时文件:

    JAVA-version>%TEMP%\file.tmp“2>&1
    <%TEMP%\file.tmp“(对于/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF 2 eq 2 ECHO))
    删除“%TEMP%\file.tmp”
    
  • 显式环绕另一个
    CMD
    实例,以在
    IF
    命令中隐藏管道:

    JAVA-version 2>&1 | CMD/C FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF 2 eq 2 ECHO)
    

  • 奇怪的发现:

    • 找到了另一个解决方法:使用比较运算符
      ==
      而不是
      eq
      ——请参阅;但这不再允许真正的数字-整数比较:

      JAVA-version 2>&1 | FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF 2==2 ECHO。)
      
    • 当您通过
      ^
      转义(至少)紧靠
      IF
      后面的空间时,命令行会意外地工作:

      JAVA-version 2>&1 | FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(IF语句中的IF^2 eq 2 ECHO。)
      
    • 前面插入
      REM/^&
      ,如果

      JAVA-version 2>&1 | FOR/F“USEBACKQ TOKENS=2 DELIMS=。%A IN(`FIND“version”/I`)DO(REM/^&IF 2 eq 2 ECHO IN IF语句。)
      

    还可以看看这个非常有趣的相关线程:

    请参见

    所以代码可以是

    JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO @(IF 2^  EQU %A ECHO INSIDE IF STATEMENT.)
    
    请看

    所以代码可以是

    JAVA -version 2>&1 | FOR /F "USEBACKQ TOKENS=2 DELIMS=." %A IN (`FIND "VERSION" /I`) DO @(IF 2^  EQU %A ECHO INSIDE IF STATEMENT.)
    

    显式定义符合管道的可执行文件会更容易

    JAVA-versio