15

バッチ (.bat) スクリプトを作成していて、フォルダーの削除に失敗した場合に対処する必要があります。終了コードをキャッチするために使用%errorlevel%していますが、rdコマンドの場合は機能しないようです:

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

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

なんで?何を指示してるんですか?

4

2 に答える 2

27

うわー、これはERRORLEVELが正しく設定されていない私が見た2番目のケースです!Windowsでのファイルリダイレクトおよび%errorlevel%を参照してください。

解決策は、リダイレクトの失敗を検出する場合と同じです。||オペレーターを使用して、障害が発生したときにアクションを実行します。

rd testdir || echo The command failed!

奇妙なことに、||演算子を使用すると、フォルダが空でない場合はERRORLEVELが145に正しく設定され、フォルダが存在しない場合は2に設定されます。したがって、何もする必要はありません。条件付きでコメントを「実行」すると、エラーレベルが適切に設定されます。

rd testdir || rem
echo %errorlevel%

以上で全体像がわかると思いました。しかし、以下の一連のコメントは、を使用するとまだ潜在的な問題があることを示しています/RD /S。親フォルダーの下のファイルまたはサブフォルダーが(親の下の任意のレベルで)ロックされRD /S /Q PARENT && echo removed || echo failedている場合、エラーメッセージが出力されますが、&&ブランチの代わりにブランチが起動します||。非常に残念です。親フォルダ自体がロックされているためにコマンドが失敗した場合は、||適切に起動してERRORLEVELを設定します。

stderrをstdoutと交換し、結果をにパイプすることで、すべての場合に障害を検出できFINDSTR "^"ます。一致するものが見つかった場合は、エラーが発生している必要があります。

3>&2 2>&1 1>&3 rd /s test | findstr "^" && echo FAILED

stderrとstdoutの交換は/q、「Are yousure(Y / N)?」を許可するため、欠落している場合に重要です。stdoutのエラーメッセージとは別に、stderrに表示されるようにプロンプ​​トを表示します。

于 2012-06-21T12:09:23.460 に答える
10

rderrorlevelゼロに設定されません-errorlevelそのまま残ります: 前の操作が正の値errorlevelrd終了し、正常に終了した場合、errorlevel変更されません。例: 4 未満のエラー レベルはrobocopyエラーではなく警告であり、無視できるため、ディレクトリが正常に削除された場合でも、次のコードはエラーで終了する可能性があります。

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

解決策: エラーを無視し、次の後にディレクトリがまだ存在するかどうかを確認しますrd

rd somedir
if exist somedir goto :error
于 2015-04-10T13:36:18.210 に答える