Пакетный файл Windows, все уровни ошибок - PullRequest
2 голосов
/ 14 февраля 2012

У меня есть пакетный файл, который просто загружает команды copy и xcopy, если какая-либо из них не удалась, мне нужно выпрыгнуть из копирования на метку goto, но было бы очень неудобно проверять уровни ошибок после каждого единственная копия.

Я подозреваю, что это может быть невозможно, но есть ли способ, которым я могу сделать огромный блок copys / xcopys и проверить в конце концов, был ли когда-либо уровень ошибки выше нуля?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Вы можете определить переменную, которая будет функционировать как простой «макрос». Сохраняет много печатать и не выглядит плохо.

@echo off
setlocal
set "copy=if errorlevel 1 (goto :error) else copy"
set "xcopy=if errorlevel 1 (goto :error) else xcopy"

%copy% "somepath\file1" "location"
%copy% "somepath\file2" "location"
%xcopy% /s "sourcePath\*" "location2"
rem etc.
exit /b

:error
rem Handle your error

EDIT

Вот более общая версия макроса, которая должна работать с любой командой. Обратите внимание, что решение макросов значительно быстрее, чем использование CALL.

@echo off
setlocal
set "ifNoErr=if errorlevel 1 (goto :error) else "

%ifNoErr% copy "somepath\file1" "location"
%ifNoErr% copy "somepath\file2" "location"
%ifNoErr% xcopy /s "sourcePath\*" "location2"
rem etc.
exit /b

:error
rem Handle your error
1 голос
/ 14 февраля 2012

Вы можете заключить действие в подпрограмму;

@echo off
setlocal enabledelayedexpansion
set waserror=0

call:copyIt "copy", "c:\xxx\aaa.fff",  "c:\zzz\"
call:copyIt "xcopy /y", "c:\xxx\aaa.fff",  "c:\zzz\"
call:copyIt "copy", "c:\xxx\aaa.fff",  "c:\zzz\"
call:copyIt "copy", "c:\xxx\aaa.fff",  "c:\zzz\"

goto:eof

:copyIt
    if %waserror%==1 goto:eof 
    %~1 "%~2" "%~3"
    if !ERRORLEVEL! neq 0 goto:failed
    goto:eof

:failed
   @echo.failed so aborting
   set waserror=1
...