背景
バッチからPowerShellスクリプトを実行するときに、同じログファイルにリダイレクトしたら著しく文字化けしたのを何とかしようと思って。
バッチでのログファイルリダイレクトに慣れていると、うっかりやりがちだと思います。
どういう状況?
たとえばこんな感じです。
hoge.bat
set LOGPATH=C:\temp\hoge.log
IF NOT EXIST %LOGPATH% (
TYPE NUL > %LOGPATH%
)
echo バッチ処理 > %LOGPATH%
@REM -PowerShellスクリプトを呼ぶバッチ
powershell -ExecutionPolicy RemoteSigned -File .\sample.ps1 %LOGPATH%
sample.ps1
Param(
[String]$logFilePath
)
echo $logFilePath
Write-Output "Powershellでの書き込み" >> $logFilePath
出力されたログをメモ帳で開くと、こんな感じで見えます。
絶妙に気持ち悪い。
Out-Fileでエンコーディング指定すると良い
こう書けば同じログファイルに追記しても文字化けしないです。
sample.ps1
Write-Output('Powershellでの書き込み') | Out-File -Encoding default -Append $logFilePath
-Appendは追記オプションです。これがないと、上書きされてしまいます。
Write-Outputの文字コードデフォルトを確認してみる
単純にリダイレクトだけしてファイル作成してみると、UTF-16で書き込まれるようです。
一連の処理をバッチで実行したい場合、ログファイルを共通化するときは文字コードに注意が必要ですね。