PowerShellのログが日本語だけ文字化けする場合、PowerShell 5.1とPowerShell 7、出力エンコーディング、ログの閲覧アプリを区別します。UTF8という指定でも版によりBOMの扱いが違うためです。
文字化けが入力側か出力側かを確認する
- ログファイルを作っているPowerShellの版を
$PSVersionTable.PSVersionで確認します。 - ログの書き出しに
Out-File、Set-Content、Add-Contentのどれを使っているか調べます。 - 閲覧側が文字コードを自動判別できるかを確認します。
- 英数字は正常なのに日本語だけ化ける場合はエンコーディングを優先して調べます。
PowerShellの版に合わせてエンコードを指定する
- ログ出力関数のコピーを用意します。
- テスト文字列「日本語ABC123」を小さなファイルへ書き出します。
- Windows PowerShell 5.1の
Out-File -Encoding UTF8は、UTF-8 BOM付きで出力します。 - PowerShell 7では
utf8NoBOMの指定可否などを実際の版のヘルプで確認します。 - 書き出したファイルをメモ帳と想定する集計ツール双方で開き、表示が一致するか確認します。
追記時に異なる文字コードを混在させない
- 既存ログの文字化けを上書き保存すると原因調査の証拠が失われます。
- コンソール表示文字コードとファイルの保存文字コードは別です。
- 追記時に異なる文字コードのファイルへ混在させないよう注意してください。
ログの実バイトと表示を比較する
- UTF-8 BOM有無、改行、追記結果の3点を確認します。
- 本番処理へ戻す前に、既存のログ解析ツールが新形式を読み取れるか検証します。
Windows PowerShell 5.1とPowerShell 7の違い
Windows PowerShell 5.1では、Out-Fileやリダイレクト(>)の既定出力がUTF-16LEになる場合があり、Set-ContentやExport-Csvとも既定の文字コードが揃っていません。PowerShell 7系ではUTF-8(BOMなし)が多くの既定出力に使われます。同じスクリプトでも実行するPowerShellの版が違えばログの文字コードが変わり得ます。
受け取る側がUTF-8を想定するなら、ファイル生成側で必要なコマンドに-Encoding UTF8等を明示し、実際の先頭バイトと文字内容をテストします。5.1のUTF8はBOM付きになる点にも注意してください。コンソールだけ文字化けする場合はファイル自体の文字コードとは別に表示環境を調べます。
異なる版で同名のUTF8指定を使うとき
公式の文字エンコード仕様では、Windows PowerShell 5.1のUTF8はBOM付き、PowerShell 7の既定のUTF-8出力はBOMなしという違いがあります。ログをほかのツールへ取り込む場合、必要なのは「UTF-8という名前」だけでなくBOMの有無と受け取り側の仕様です。PowerShell 5.1の出力をPowerShell 7へ移すときも、既存ログへの追記で異なるエンコードを混ぜないでください。
