在Windows批处理文件中切换语句等效

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)

  • 谢谢!可读性始终很好,但我想知道是否有可能避免重复比较表达式(此处为“ IF“%ID%” == ...“)。 (2认同)

小智 8

简短命令的紧凑形式(无“ echo”):

IF "%ID%"=="0" ( ... & ... & ... ) ELSE ^
IF "%ID%"=="1" ( ... ) ELSE ^
IF "%ID%"=="2" ( ... ) ELSE ^
REM default case...
Run Code Online (Sandbox Code Playgroud)

之后^必须是立即行的结尾,不能有空格。


Pet*_*alo 6

我想所有其他选项都会更加神秘。对于那些喜欢可读和非神秘代码的人:

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. 更多神秘的“鸡蛋”可以在这里找到。