事件
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