如何在批处理脚本中正确运行多个if条件

时间:2014-12-30 10:45:26

标签: batch-file

我的脚本如下:

@echo off
setlocal enabledelayedexpansion
set Current_Node=Node1
set counter=0

if "%Current_Node%" == "Node5" ( GOTO CASE_%counter%
:CASE_0
  ECHO  "case 0"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH
:CASE_1
   ECHO  "case 1"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
 GOTO END_SWITCH
:CASE_2
  ECHO  "case 2"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
 GOTO END_SWITCH
:CASE_3
 ECHO  "case 3"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH
 :CASE_4
  ECHO  "case 4"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH
 :CASE_5
ECHO  "case 5"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
GOTO END_SWITCH
:END_SWITCH
 set  /A counter=%counter%+1
 if %counter% LEQ 3 (
 echo helloooooo
 GOTO CASE_%counter% 
) ELSE ( 
echo "NO MORE EXE'S AVAILABLE"
)
) 
)
pause 

if "%Current_Node%" == "Node1" ( GOTO CASE_%counter%
 :CASE_0
  ECHO  "case 0"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH
:CASE_1
   ECHO  "case 1"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
 GOTO END_SWITCH
:CASE_2
  ECHO  "case 2"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
 GOTO END_SWITCH
:CASE_3
 ECHO  "case 3"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH
 :CASE_4
  ECHO  "case 4"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH
 :CASE_5
ECHO  "case 5"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
 GOTO END_SWITCH
:END_SWITCH
 set  /A counter=%counter%+1
 if %counter% LEQ 5 (
GOTO CASE_%counter% 
) ELSE ( 
echo "NO MORE EXE'S AVAILABLE"
)
)  
)
pause

现在,当我运行这个时,我没有得到正确数量的exe运行。我不知道问题出在哪里。

当我运行单一if条件时,我不会遇到这个问题,只有当我添加多个if条件时才会发生这个问题。所以,请帮助。

3 个答案:

答案 0 :(得分:0)

您的示例很难阅读,但这将检查两个条件。

if "%Current_Node%" == "Node5" if %counter% EQU 0 (
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
)

if "%Current_Node%" == "Node5" if %counter% EQU 1 (
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
)

答案 1 :(得分:0)

我真的不明白你的程序应该做什么(例如,当CurrentNode何时设置为" Node5"?),所以我不能提供改变版本,但总的来说,你必须自己实现逻辑运算符。 SET /A有一些按位运算符,如果您自己计算每个条件并将结果保存在变量中,它将起作用。

逻辑AND很简单。你只需将两个if语句链接在一起。其他人的工作更多。一种可能性是以算术方式进行。这是一个逻辑OR(使用SET /A的按位OR运算符实现)。

IF "%Current_Node%"=="Node5" (SET COND_A=1) ELSE (SET COND_A=0)
IF "%counter%"=="1" (SET COND_B=1) ELSE (SET COND_B=0)
SET /A "_OR=COND_A | COND_B"
IF "%_OR%"=="1" (
    REM Stuff to do when OR condition is true
) ELSE (
    REM Stuff to do when OR condition is false
)

使用按位XOR(^)运算符可以类似地实现异或。 IFF(if和only if)需要使用相等的比较来实现。


<强>更新

查看您的代码,我发现至少有一个基本问题:您在设置变量的同一()块内尝试变量替换。虽然我找不到实际的文档(关于CMD解析完全 - 我假设不存在),但似乎CMD在它运行任何内容之前解析/评估()内的所有内容,以及任何变量在任何语句运行之前,使用%var_name%替换

以下是一个例子:

if "%Current_Node%" == "Node5" ( GOTO CASE_%counter%
REM ... other code removed for brevity ...
:END_SWITCH
 set  /A counter=%counter%+1
 if %counter% LEQ 3 (
 echo helloooooo
 GOTO CASE_%counter% 
) 
)

如果您希望这样做,您需要使用延迟扩展,可以在脚本中启用(通常在开始时,但至少在您使用它之前的某个时间)SETLOCAL

SETLOCAL ENABLEDELAYEDEXPANSION

在扩展变量之前,延迟扩展会一直等到代码执行完毕。它还使用不同的字符来表示扩展:!。上面的代码段将是:

if "%Current_Node%" == "Node5" ( GOTO CASE_%counter%
REM ... other code removed for brevity ...
:END_SWITCH
 set  /A counter=counter+1
 if !counter! LEQ 3 (
 echo helloooooo
 GOTO CASE_!counter!
) 
)

BTW,SET /A允许您使用不带扩展字符的变量名称。此外,IF附带的运算符是词法(字符串比较),因此他们不会进行直接的数值比较。例如,尝试:

IF "10" LEQ "5" ECHO Less Than
IF "10" LEQ "05" ECHO Less Than

只有第二个会产生预期的结果。使用零(或空格)填充数字是使用词法比较运算符进行数值比较的唯一方法。在您提供的代码中,在counter达到10之前,您不会发现问题,然后10 LEQ 5会评估为真。

答案 2 :(得分:0)

你不能跳进一个街区。标签在批次中必须是唯一的。

if "%Current_Node%"=="Node5" (GOTO CASE_%counter%)
if "%Current_Node%"=="Node1" (GOTO KASE_%counter%)
echo neither node1 nor node 5
goto :eof

:CASE_0
  ECHO  "case 0"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH
:CASE_1
   ECHO  "case 1"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
 GOTO END_SWITCH
:CASE_2
 ... and so on...
:END_SWITCH
set  /A counter=%counter%+1
if %counter% LEQ 3 (
 echo helloooooo
 GOTO CASE_%counter% 
) ELSE ( 
echo "NO MORE EXE'S AVAILABLE"
)
pause
goto :eof

:KASE_0
  ECHO  "kase 0"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO END_SWITCH_1
:KASE_1
   ECHO  "kase 1"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
 GOTO END_SWITCH_1
:KASE_2
 ... and so on...
:END_SWITCH_1
set  /A counter=%counter%+1
if %counter% LEQ 3 (
 echo helloooooo again!
 GOTO KASE_%counter% 
) ELSE ( 
echo "NO MORE EXE'S AVAILABLE for node 1"
)
pause
goto :eof

话虽如此,你的例子是人为的;你试图做的是阴暗的。

另一种方法可能是

set Current_Node=Node1
for /L %%a in (0,1,5) do call Case_%current_node%_%%a
goto :eof

:CaSE_Node1_0
  ECHO  "CaSE_Node1_0"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO :EOF

:CaSE_Node1_1
  ECHO  "CaSE_Node1_1"
  start sample1.exe -configuration 
  start sample2.exe -configuration 
  start sample3.exe -configuration 
  GOTO :EOF
 ...etc.

但这需要了解您对counter实际想要做什么。

需要更多解释您的目标 - 还有其他结构,具体取决于您想要做什么。