Manipulando erros do comando goto no Batch

4

Para ir direto ao problema, eu preciso de um arquivo em lotes para não fechar automaticamente se o meu comando goto não for válido (goto Non lugar existente) e sim eu tenho uma pausa depois dele

Aqui está a seção:

set /p Command=
goto %Command%
pause

Obrigado Pizza

    
por Pizza 29.04.2017 / 15:06

2 respostas

3
  • 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:
> 
    
por 29.04.2017 / 17:23
4
:redo
set /p "Label=goto label:"
findstr /i "^:%Label%" "%~0" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
pause

Editar Tenho que admitir que o lote falhará se o rótulo inserido for uma subseqüência inicial de um rótulo presente.

    
por 29.04.2017 / 15:24