4

Чтобы разобраться с проблемой, мне нужен пакетный файл, чтобы он не закрывался автоматически, если моя команда goto недействительна (goto несуществующее место), и да, у меня после этого пауза

Вот раздел:

set /p Command=
goto %Command%
pause

Спасибо пицца

2 ответа2

4
:redo
set /p "Label=goto label:"
findstr /i "^:%Label%" "%~0" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
pause

Изменить Я должен признать, что пакет не будет выполнен, если введенная метка является начальной подстрокой настоящей метки.

3
  • Эта более безопасная версия сначала собирает все метки в строку, одна директива следует за другой.
  • Двоеточие следующей метки обозначает конец предыдущей.
  • Строка %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:
> 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .