我的脚本如下:
@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条件时才会发生这个问题。所以,请帮助。
答案 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
实际想要做什么。
需要更多解释您的目标 - 还有其他结构,具体取决于您想要做什么。