Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows批处理文件包含所有错误级别_Windows_Batch File_Xcopy_Errorlevel - Fatal编程技术网

Windows批处理文件包含所有错误级别

Windows批处理文件包含所有错误级别,windows,batch-file,xcopy,errorlevel,Windows,Batch File,Xcopy,Errorlevel,我有一个批处理文件,它只执行大量的copy和xcopy命令,如果其中任何一个命令失败,我需要跳出复制到一个goto标签,但是在每次复制后都要检查errorlevels是非常不方便的 我怀疑这可能是不可能的,但是有没有一种方法可以让我做大量的copy/xcopy,并在最后检查errorlevel是否超过零 您可以将操作包装在子例程中 @echo off setlocal enabledelayedexpansion set waserror=0 call:copyIt "copy", "c:\x

我有一个批处理文件,它只执行大量的copy和xcopy命令,如果其中任何一个命令失败,我需要跳出复制到一个goto标签,但是在每次复制后都要检查errorlevels是非常不方便的


我怀疑这可能是不可能的,但是有没有一种方法可以让我做大量的copy/xcopy,并在最后检查errorlevel是否超过零

您可以将操作包装在子例程中

@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

可以将变量定义为简单的“宏”。节省了大量的打字,而且看起来也不错

@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

编辑

这里有一个更通用的宏版本,可以与任何命令一起使用。请注意,宏解决方案比使用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

应该行得通,但为什么要推迟扩张?如果任何路径包含
,延迟扩展将导致问题。还有,为什么不在IF语句中设置waserror并消除goto:failed?