うわー、これは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
問題は '%errorlevel%'に関係していて、 'rd'とは何の関係もないと思います。私は、より確定的な振る舞いのために、この構造体を使ってエラーハンドリングを書き直すべきだと思います。ありがとう! – etuardu
これはコード2と145でうまくいきますが、 "アクセスが拒否されました"または "プロセスが別のプロセスで使用されているためファイルにアクセスできません"の場合、ERRORLEVELは変更されません。 : –
@AndreasVergison - ありがとうございます!あなたの情報で私の回答を更新しました – dbenham