2012-06-21 13 views
11

バッチ(.bat)スクリプトを作成していますが、フォルダの削除に失敗した場合を処理する必要があります。私は、終了コードをキャッチする%errorlevel%を使用していますが、それはそうrdコマンドの場合には動作しない:バッチ: "rd"の終了コードもエラー時に0です

C:\Users\edo\Desktop>rd testdir 
Directory is not empty 

C:\Users\edo\Desktop>echo %errorlevel% 
0 

なぜ?何を指示してるんですか?
ありがとうございます!

答えて

20

うわー、これはERRORLEVELが正しく設定されていない場所で見た2番目のケースです! File redirection in Windows and %errorlevel%を参照してください。

解決方法は、リダイレクトの失敗を検出する場合と同じです。 ||オペレーターを使用して、障害発生時に対処してください。

rd testdir || echo The command failed! 

あなたが||演算子を使用する場合、フォルダが存在しなかった場合は、フォルダが空、または2でなかった場合は奇妙な事は、ERRORLEVELは、その後145に適切に設定されています。だからあなたは何もする必要はありません。条件付きで発言を実行すると、エラーレベルが適切に設定されます。戻る2015年4月に更新2016年1月21日

rd testdir || rem 
echo %errorlevel% 

は、アンドレアスVergisonは||がで...「「アクセス拒否」のためのERRORLEVELを設定するか、しなかったことをコメントに記載しました... "エラーが発生します。私は当時Windows 7を持っていましたが、私は彼の主張を検証したとは思っていませんが、彼が正しいと仮定しました。しかし、私は最近、Windows 10でテストしました。||はエラー時に常にERRORLEVELを非ゼロに設定します。 (call)は、各コマンドを実行する前にERRORLEVELを強制的に0にする手の込んだ方法です。また、私のcmd.exeセッションが遅延拡張を有効にしていることにも注意してください。

C:\test>(call) & rd junk && echo OK || echo ERROR !errorlevel! 
Access is denied. 
ERROR 5 

C:\test>(call) & rd test && echo OK || echo ERROR !errorlevel! 
The directory is not empty. 
ERROR 145 

C:\test>(call) & rd \test && echo OK || echo ERROR !errorlevel! 
The process cannot access the file because it is being used by another process. 
ERROR 32 

C:\test>(call) & rd notExists && echo OK || echo ERROR !errorlevel! 
The system cannot find the file specified. 
ERROR 2 
+0

問題は '%errorlevel%'に関係していて、 'rd'とは何の関係もないと思います。私は、より確定的な振る舞いのために、この構造体を使ってエラーハンドリングを書き直すべきだと思います。ありがとう! – etuardu

+3

これはコード2と145でうまくいきますが、 "アクセスが拒否されました"または "プロセスが別のプロセスで使用されているためファイルにアクセスできません"の場合、ERRORLEVELは変更されません。 : –

+0

@AndreasVergison - ありがとうございます!あなたの情報で私の回答を更新しました – dbenham

3

rderrorlevelゼロに設定されていません - それはerrorlevelそのまま残します:f.e.を前の操作が正の値であるerrorlevelで終了し、rdが正常に終了すると、errorlevelは変更されません。例:robocopy 4以下のエラーレベルは警告ではなくエラーで、次のコードは、エラーで終了することがありので、ディレクトリが正常に削除された場合でも、無視することができます。

robocopy ... 
if errorlevel 4 goto :error 
rd somedir 
if errorlevel 1 goto :error 

ソリューション:エラーを無視し、ディレクトリかどうかをチェックまだ存在していますrd

rd somedir 
if exist somedir goto :error 
+1

また、 'robocopy'について:このコマンドは、内部エラーを永久に上書きする環境変数を作成するため、チェックした後にエラーレベルを' set errorlevel = 0'でリセットしてください。エラーレベル。 [ここをクリック](http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx) – rychu

関連する問題