it-swarm-ja.com

バッチでのgotoコマンドエラーの処理

問題に直接取り組むには、バッチファイル自動クローズしない必要があります)gotoコマンドが有効でない場合(goto存在しない場所に移動)、はい、その後一時停止します

セクションは次のとおりです。

set /p Command=
goto %Command%
pause

ありがとうピザ

4
Pizza
  • このより安全なバージョンは、最初にすべてのラベルを文字列に収集し、一方が他方に続きます。
  • 次のラベルのコロンは、前のラベルの終わりを示します。
  • 文字列%Labels%コロンがfindstrにエコーされ、入力されたラベルにもコロンが追加されるため、完全なラベルのみが一致します。

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion

Set "Labels="&For /f %%A in ('findstr /i "^:[a-z]" %0') Do Set "Labels=!Labels!%%A"

:redo
Set "Label="&set /p "Label=Choose label %Labels%:"
if not defined Label goto :Eof
Echo %Labels%:|findstr /i ":%Label::=%:" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
Echo we'll never reach here

:One
Echo Label One
goto :redo

:Two
Echo Label Two
goto :redo

:Three
Echo Label Three
goto :redo

サンプル出力:

> SU_1204527.cmd
Choose label :redo:One:Two:Three:one
Label One
Choose label :redo:One:Two:Three:two
Label Two
Choose label :redo:One:Two:Three:blah
invalid label blah
Choose label :redo:One:Two:Three:
> 
3
LotPings
:redo
set /p "Label=goto label:"
findstr /i "^:%Label%" "%~0" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
pause

編集入力したラベルが現在のラベルの最初の部分文字列である場合、バッチが失敗することを認める必要があります。

4
LotPings