標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

個人的インシデント:バッチファイルで %DATE% は安易に使うべきではなかった

事件

Windows のタスクバーに曜日を表示しようと思い、

  • コントロールパネル
    • 日付、時刻、数値形式の変更
      • 日付の短い形式

の末尾に曜日を意味する dddd を追加したら、タスクバーの表示内容だけでなく、CMD.EXE の疑似環境変数%DATE% の中に「漢字」で曜日が入るようになってしまった。

この結果、%DATE% が YYYY/MM/DD 形式であることに依存していたマインクラフトデータのバックアップのバッチファイルが誤動作し、tar ファイルのファイル名に日本語が入った。

バックアップ先には、「さくらポケット」というストレージサービスを用いていたが、同サービスはファイル名の日本語コードとして EUC-JP を想定していた。これに対して、バックアップに使っていたツール rclone は UTF8 を想定していたため、文字化けが発生してしまった。

( 単に化けただけではなく、どうもFTPサーバー側で誤認識が発生したらしく、本来ファイルとして作られるべきものが、空のディレクトリと認識されてしまっていた)

対策

安易に Windows の「日付、時刻、数値形式」を変更したのもよくなかったが、同項目の修正はネットで紹介されている Tips で、比較的誰でもおかしがちなものであるため、バッチファイル側でそれらの影響をうけないようにすべきだった。

%DATE%ロケール情報で内容が左右されると聞いていたが、地域情報など滅多に変えないので、日本で使用する分には滅多に変わらないという思い込みがあった。

ロケール情報で左右されない wmic os get LocalDateTime の出力結果を使うべきだった。 ( これも存在を認識してはいたが、使用が煩雑なので、つい使用を避けてしまった )

対応としてバッチファイルを次のように修正した。

修正前のバッチファイル

tar -C "%APPDATA%\.minecraft\saves" -cvf - Demo_World | zstd | rclone rcat "(中略)/minecraft-Demo_World-%DATE:/=%.tar.zst"

修正後のバッチファイル

call :setdt
tar -C "%APPDATA%\.minecraft\saves" -cvf - Demo_World | zstd | rclone rcat "(中略)/minecraft-Demo_World-%DT:~0,8%.tar.zst"
exit /b

:setdt
    for /F "skip=1" %%I in ('wmic os get LocalDateTime') do set DT=%%I && exit /b

余談

  • 名前が化けたファイルは、さくらポケット自体の機能では削除できず、WindowsFTP.EXEの mdel などでも削除できず、結局、ファイル名文字コードを指定できる FFFTP などが必要になった。以前ならば、ssh でログインしてどうとでも出来たが、コスト削減のため、シェルアカウントのあるサービスから、FTPしかないサービスに切り替えていたため使えなかった
  • まぁ、本来、この手の用途はバッチファイルではなく、PowerShell などを使うべきなんでしょうがね