背景
CSVファイルを生成して、決まったディレクトリに出力するバッチファイルを一日一回実行するタスクスケジューラを設定したのに、うまく動作していなかったので原因を調べていたら文字コードのせいでした。
開発環境
- Windows10
- VSCode
問題が起こっていた部分
.bat
REM こちらのバッチファイルはUTF-8で記述されていました
@echo off
set EXPORT_PATH=%~dp0日本語フォルダ\hoge.txt
echo %EXPORT_PATH% >> tmp.txt
...
上記のバッチファイルを実行してtmp.txt
を確認すると…
.txt
***\譌・譛ャ隱槭ヵ繧ゥ繝ォ繝蜷構hoge.txt
解決方法
原因としては出力先のフォルダ名が日本語で、記述されたバッチファイルのエンコードがUTF-8なのに対して、実行するコマンドプロンプトの文字コード設定がShift_JISだった、ということでした。
なので、バッチファイル内に文字コードの設定を変更するような一文を追記することで正しい出力先を設定できるようにしました。
.bat
@echo off
chcp 65001 > nul
set EXPORT_PATH=%~dp0日本語フォルダ\hoge.txt
echo %EXPORT_PATH% >> tmp.txt
...
コマンドプロンプトの文字コードの設定はCHCP
コマンドでできますので、今回の場合はUTF-8の65001に設定しています。
*バッチファイルの文字コードに合わせる
まとめ
当たり前に思われたかもしれませんが、CMDと.batの文字コード設定が違うと化けます。環境によってはバッチファイルの先頭にchcp
コマンドでエンコーディングの設定をしましょう。
今回はバッチファイルの処理内容が単純なものだったため、動くだろうと思ってテストもせずにスケジューラ設定してしまったのは失敗でした。