2009-05-07 3 views
4

В пакетном файле Windows я беру необязательный параметр, который позволяет вызывающему абоненту перейти к середине командного файла и возобновить его.Восстановление из недействительной команды GOTO в пакетном файле 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 

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

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

ответ

8

Вы можете попробовать использовать Findstr от партии установочной цели Гото:

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

Это немного рубить, но он должны работать.

+3

пакетные файлы самоанализа! аккуратный. – Anonymous

+0

Кодирование со стилем: если имя командного файла включает пробелы, то '% 0' уже содержит кавычки (иначе вы не могли бы запустить пакет в первую очередь). С '% ~ 0' вы просто снимаете кавычки и повторно добавляете их. – Joey

+0

Да, узнайте что-то новое каждый день. Это совершенно нестандартное поведение, но я понимаю, почему они это сделали. –

3

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

@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:\>
+2

Вы можете использовать 2> nul после вызова для подавления вывода сообщения об ошибке. – Joey

+0

А, спасибо. Я попробовал> нуль, и это ничего не делало. – Anonymous

+0

На https://ss64.com/nt/call.html, тестирование Windows 7 и ваш образец вывода, похоже, что неудачный вызов устанавливает значение «ERRORLEVEL» равным 1. Это означает, что если вы используете 'call' в подпрограмме, которая возвращает код состояния с 'exit/b' (вместо использования в качестве goto), вам нужно выяснить, является ли ваш' ERRORLEVEL' 1 из-за отсутствующей метки или из-за ошибки, о которой сообщает подпрограмма. Одним из способов решения этой проблемы было бы, чтобы каждая подпрограмма установила var (например, «FOUND'), чтобы указать, что метка действительно найдена. – Tydaeus

0

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

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

1

Возможно, я сделаю это так.

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 
Смежные вопросы