47

単一の式の値に応じて、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...
)

とても愚かです。より良い解決策はありますか?

4

9 に答える 9

72

AjV Jsy によって提案されたように、ケース式の値を含むラベル名を使用することになりました。とにかく、正しいケースブロックにジャンプして戻るCALL代わりに使用します。次のサンプル コードは、アイデアを示す完全なバッチ スクリプトです。GOTOGOTO :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
于 2013-11-05T18:03:10.607 に答える
2

switch / case今日バッチファイルを検索したところ、これに出くわしました。私はこのソリューションを使用し、goto exit.

IF "%1"=="red" echo "one selected" & goto exit
IF "%1"=="two" echo "two selected" & goto exit
...

echo "Options: [one | two | ...]

:exit 

ifこれにより、選択が見つかったときにデフォルトの状態 (エコー行) が表示され、余分な's は表示されません。

于 2016-07-17T09:25:50.797 に答える
1

が機能しない場合ifは、次を使用します。

:switch case %n%=1 
statements;
goto :switch case end
etc..

http://lallouslab.net/2016/12/21/batchography-switch-case/

于 2018-01-31T01:20:07.423 に答える
1

少し遅いかもしれませんが、これはそれを行います:

set "case1=operation1"
set "case2=operation2"
set "case3=operation3"

setlocal EnableDelayedExpansion
!%switch%!
endlocal

%switch% は、行の実行前に置き換えられます。深刻な欠点:

  • ケース変数をオーバーライドします
  • DelayedExpansion が必要です

場合によっては、最終的に役立つかもしれません。

于 2018-02-16T11:04:40.943 に答える