- Esta versão mais segura primeiro reúne todos os rótulos em uma string, um diretamente após o outro.
- Os dois pontos do próximo rótulo denotam o fim do anterior.
- A string
%Labels%
e um ponto-e-vírgula são ecoados para o findstr, o rótulo inserido também é anexado com dois-pontos para que apenas os rótulos completos sejam correspondidos.
@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
Exemplo de saída:
> 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:
>