謎仕様
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
結論
どっちでもいいとは思うので、好みの方法でやればいいんだと思う。