2015-03-05 4 views
3

У сценариев Windows .bat есть функция выхода из ловушки, которая позволяет регистрировать действия по очистке, которые всегда нужно запускать?Поддерживает ли пакетные файлы выходные ловушки?

Мне не интересно какое-либо решение, использующее Powershell или другие оболочки (у меня уже установлен Python на целевой системе, поэтому, если это невозможно сделать в пакетных файлах, я просто завершу кучу вызовов в подпроцесс. Попэн в попытке ... наконец).

+0

Что вызывает вопрос? –

+0

Я хочу, чтобы некоторые временные файлы блокировки очищались в конце командного файла. – antony

ответ

4

Нет, исключений нет и нет формального способа регистрации процедуры выхода для автоматического запуска после завершения.

Однако вы можете приблизиться, если вам не нужны изменения среды, которые необходимо сохранить после завершения сценария. Вы можете запустить большую часть своего скрипта в новом сеансе CMD, а затем вы можете иметь процедуры очистки на родительском уровне, которые всегда будут выполняться после завершения, пока окно консоли не будет уничтожено. Контроль будет возвращен назад к внешней оболочке, если внутренний сценарий завершается нормально, или прекращает за счетом Ctrl-C, или прекращает из-за фатальную ошибку синтаксиса и т.д.

Вот тривиальная демонстрация:

@echo off 
if "%~1" equ ":main" (
    shift /1 
    goto main 
) 
cmd /d /c "%~f0" :main %* 
echo Cleanup actions go here 
exit /b 

:main 
echo Main actions go here 
exit /b 

UPDATE - взломанные исключения

С тех пор я разработал эффективный исключение хак, не используя ничего, кроме родных команд партии - См Does Windows batch support exception handling?.

Исключения могут быть выброшены на любом уровне вашего кода, и исключение пузырится до тех пор, пока блок catch не обработает исключение. Код не может распознавать ошибки самостоятельно - каждое исключение должно быть явно выбрано вашим кодом. Он также не может реагировать на фатальные ошибки синтаксиса или закрытую консоль. Но если эти ограничения приемлемы, то это чрезвычайно эффективный способ установки кода очистки.

+0

EDIT - используйте параметр/D, чтобы предотвратить запуск команд AutoRun при создании экземпляра дочерней оболочки. – dbenham

+0

Я думал, что это были настройки для кодов выхода, для обеспечения возможности запуска дополнительных пакетных файлов в зависимости от кода выхода первичного файла (ов). – user4317867

+0

@ user4317867 - Код выхода (errorlevel) только сообщает CALLER, что такое возвращаемый статус - он не позволяет родительскому процессу выполнить. Если CALLed-скрипт или ярлык прерывается ненормально из-за ошибки Ctrl-C или фатальной синтаксиса, вся пакетная обработка немедленно завершается, и управление никогда не возвращается обратно в CALLer. Мой ответ использует CMD/C для решения этой проблемы. – dbenham

1

Пакет не поддерживает ничего подобного.

Однако, cmd также не имеет исключений и очень мало способов аномального завершения скрипта (синтаксическая ошибка в вашем скрипте или, например, сбой cmd.exe). Если ваш скрипт не намеренно завершает себя, следует просто поместить любую очистку в конец вашего скрипта.

Чтобы продолжить, вы можете вызвать свой командный файл в подоболочке из другого пакетного файла, а внешний скрипт - очистить. Затем, независимо от того, что происходит в скрипте, внешняя оболочка будет запускать следующую команду во внешней партии, когда она закончится.

Смежные вопросы