2012-02-14 6 views
2

コピーとxcopyコマンドのロードを行うバッチファイルがあります。失敗した場合はgotoラベルへのコピーから飛び越す必要がありますが、非常に不便です単一のコピーごとにエラーレベルをチェックする必要があります。すべてのエラーレベルをカバーするWindowsバッチファイル

私はそれが可能ではないかもしれないと思っていますが、私はcopys/xcopysの巨大なブロックを実行し、errorlevelがゼロ以上になったかどうかを最後に確認できますか?

答えて

1

サブルーチンでアクションをラップすることができます。

@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 
+0

これはすばらしい、thankyou =) –

+1

なぜ拡張は遅くなるのですか? pathのいずれかに '!'が含まれていると、遅延展開によって問題が発生します。 IF文にwaserrorを設定してgotoを削除しないのはなぜですか?失敗しましたか? – dbenham

2

変数を単純な「マクロ」として機能させることができます。多くの入力を省き、どちらかといえば悪くはありません。

@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

は、任意のcommmandで動作するはずがより汎用的なマクロ版です。マクロソリューションは、CALLを使用するよりもはるかに高速です。

関連する問題