Восстановление из недопустимой команды GOTO в командном файле Windows - PullRequest
4 голосов
/ 07 мая 2009

В пакетном файле Windows я принимаю необязательный параметр, который позволяет вызывающей стороне перейти к середине пакетного файла и продолжить с него.

Например:

if [%1] neq [] (
echo Starting from step %1
goto %1
if %errorlevel% neq 0 goto error
)

:step1

:step2

...

goto end
:error
echo Error handler
...

:end

Если предоставленный параметр не является допустимой меткой, пакетный файл немедленно завершается с ошибкой Системе не удается найти указанную метку партии .

Можно ли как-нибудь обработать эту ошибку и либо выполнить мой блок обработчика ошибок, либо возобновить выполнение всего пакетного файла, как если бы не был указан параметр?

Ответы [ 5 ]

8 голосов
/ 07 мая 2009

Вы можете попробовать использовать findstr в пакете, определяющем цель goto:

findstr /r /i /c:"^:%1" %0>nul
if errorlevel 1 goto error

Это что-то вроде хака, но должно работать.

3 голосов
/ 07 мая 2009

call :label выдает ошибку не выдает ошибку, когда stderr перенаправляется (спасибо, Йоханнес), и, похоже, не меняет уровень ошибки, но продолжает работу с командным файлом , Вы можете установить переменную после метки, чтобы указать, насколько далеко зашло выполнение.

@echo off
call :foo 2>nul
echo %errorlevel%
:bar
echo bar

выходы

C:\>test.cmd
The system cannot find the batch label specified - foo
1
bar
C:\>
1 голос
/ 07 мая 2009

Я бы, наверное, так и сделал.

ECHO Starting from %1
IF "%1" == "step1" GOTO :step1 
IF "%1" == "step2" GOTO :step2
IF "%1" == "step3" GOTO :step3
IF "%1" == "step4" GOTO :step4
ECHO %1 is not valid label name
0 голосов
/ 04 мая 2018
goto :label || (
  echo my error handler
)
0 голосов
/ 07 мая 2009

Я не думаю, что пакетные файлы Windows поддерживают какую-либо обработку ошибок (кроме if errorlevel...). Вам нужно будет подтвердить, что переданное значение является допустимой меткой до goto.

Если это вообще возможно, я бы рекомендовал использовать PowerShell, который является более богатым языком и включает обработку ошибок на основе исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...