GOT*_*O 0 33 batch-file switch-statement
我想知道是否有一种简单的方法可以在Windows批处理文件中执行分支,具体取决于单个表达式的值.类似于C,C++,C#,Java,JavaScript,PHP和其他真实编程语言中的switch/case块的东西.
我唯一的解决方法是一个简单的if/else块,其中重复检查相同的表达式是否与不同的值相等:
IF "%ID%"=="0" (
REM do something
) ELSE IF "%ID%"=="1" (
REM do something else
) ELSE IF "%ID%"=="2" (
REM do another thing
) ELSE (
REM default case...
)
Run Code Online (Sandbox Code Playgroud)
如此愚蠢.有更好的解决方案吗?
GOT*_*O 0 63
我最终使用了包含AjV Jsy建议的case表达式值的标签名称.无论如何,我使用CALL而不是GOTO跳进正确的case块并GOTO :EOF跳回来.以下示例代码是说明该想法的完整批处理脚本.
@ECHO OFF
SET /P COLOR="Choose a background color (type red, blue or black): "
2>NUL CALL :CASE_%COLOR% # jump to :CASE_red, :CASE_blue, etc.
IF ERRORLEVEL 1 CALL :DEFAULT_CASE # If label doesn't exist
ECHO Done.
EXIT /B
:CASE_red
COLOR CF
GOTO END_CASE
:CASE_blue
COLOR 9F
GOTO END_CASE
:CASE_black
COLOR 0F
GOTO END_CASE
:DEFAULT_CASE
ECHO Unknown color "%COLOR%"
GOTO END_CASE
:END_CASE
VER > NUL # reset ERRORLEVEL
GOTO :EOF # return from CALL
Run Code Online (Sandbox Code Playgroud)
fox*_*ive 16
这更容易阅读:
IF "%ID%"=="0" REM do something
IF "%ID%"=="1" REM do something else
IF "%ID%"=="2" REM do another thing
IF %ID% GTR 2 REM default case...
Run Code Online (Sandbox Code Playgroud)
小智 8
简短命令的紧凑形式(无“ echo”):
IF "%ID%"=="0" ( ... & ... & ... ) ELSE ^
IF "%ID%"=="1" ( ... ) ELSE ^
IF "%ID%"=="2" ( ... ) ELSE ^
REM default case...
Run Code Online (Sandbox Code Playgroud)
之后^必须是立即行的结尾,不能有空格。
我想所有其他选项都会更加神秘。对于那些喜欢可读和非神秘代码的人:
IF "%ID%"=="0" (
REM do something
) ELSE IF "%ID%"=="1" (
REM do something else
) ELSE IF "%ID%"=="2" (
REM do another thing
) ELSE (
REM default case...
)
Run Code Online (Sandbox Code Playgroud)
这就像一个轶事:
魔术师:把鸡蛋放在帽子下面,做魔法传球……取下帽子……拿到同一个鸡蛋,但在侧视图中……
该IF ELSE解决方案是没有那么糟糕。它几乎和 python 的if elif else. 更多神秘的“鸡蛋”可以在这里找到。