LoginSignup
3
3

More than 5 years have passed since last update.

WindowsのDELコマンドのエラーハンドリング

Posted at

謎仕様

WindowsのDELコマンドはファイルを削除することができるが、
何かしらの理由により対象を削除できなかったときにエラーとなるのだが、
ERRORLEVELには値を設定してくれない。

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/del
オフィシャルにはそんなこと一言も書いていないけど。

なので、以下のようなエラーハンドリングをBATで作成したとしてもエラールートにはいかない。

rem オプション -Q : 削除前に確認メッセージを表示しない
call del /Q C:\temp\sample\*.dat
if %ERRORLEVEL% NEQ 0 goto ERR

goto END

:ERR
echo ファイル削除:Error > del_file.log
exit 2

:END
echo ファイル削除:OK > del_file.log
exit 0

ではどうするか?

案1

エラー時にERRORLEVELに値を設定してくれない代わりに標準エラーメッセージは出力してくれる
であれば、それを捕まえて判定する

ただ、FINDを行う都合上、ERRORLEVELにはDELでのエラー時は0,正常終了時は1となるので、そのあとの判定も逆転させておく必要がある。

rem オプション -Q : 削除前に確認メッセージを表示しない
call del /Q C:\temp\sample\*.dat 2>&1 | FIND /V ""
if exist C:\temp\assist\sample\*.dat goto ERR
if %ERRORLEVEL% NEQ 1 goto ERR

goto END

:ERR
echo ファイル削除:Error > del_file.log
exit 2

:END
echo ファイル削除:OK > del_file.log
exit 0

案2

何かしらのエラーで削除されていないのだからファイルの有無チェックでERRORLEVEL判定の代わりにする。

こんな感じになるかと
同じパスを二回ずつ書かないといけないのがなんだかダサいが、修正する箇所は一行で済む。

rem オプション -Q : 削除前に確認メッセージを表示しない
call del /Q C:\temp\sample\*.dat
if exist C:\temp\sample\*.dat goto ERR

goto END

:ERR
echo ファイル削除:Error > del_file.log
exit 2

:END
echo ファイル削除:OK > del_file.log
exit 0

結論

どっちでもいいとは思うので、好みの方法でやればいいんだと思う。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3