Batch file 使用IF inside FOR循环,并在CMD内使用管道内容
我正在编写一个批处理安装程序,在安装过程中我必须检查java的版本。 为此,我在批处理中使用以下代码: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 -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