PowerShell のエンコーディング指定💩


はじめに

PowerShell のエンコーディングは色々あって分かりにくくて💩。

しかもバージョンによってデフォルト値が異なっていたり混乱の極み。

エンコード変数 説明
[System.Console]::OutputEncoding コンソールが出力の書き込みに使用するエンコード
$OutputEncoding データを外部アプリケーションにパイプで渡す時のエンコード
$PSDefaultParameterValues コマンドレットの既定のエンコード(リダイレクト時のエンコード)

まるっとUTF-8にする場合は以下。

chcp 65001
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
$OutputEncoding = [Text.Encoding]::UTF8
[Console]::OutputEncoding = [Text.Encoding]::UTF8


Console.OutputEncoding プロパティ

コンソールが出力の書き込みに使用するエンコードを指定。

[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8

System は省略できるので以下でも同じ。

[Console]::OutputEncoding = [Text.Encoding]::UTF8

chcp 65001 の代わり?

chcp 932 の SJIS が必要な場合は以下で得ることができる。

[System.Text.Encoding]::GetEncoding("shift_jis")
[System.Text.Encoding]::GetEncoding(932)


$OutputEncoding

データを外部アプリケーションにパイプするときに使用するエンコーディングを設定。

出力リダイレクト演算子やコマンドレットによるファイル出力には影響しない(後述の$PSDefaultParameterValues)。

$global:OutputEncoding = [System.Text.Encoding]::UTF8

現在のスコープで良ければ以下でも同じ。

$OutputEncoding = [System.Text.Encoding]::UTF8


$PSDefaultParameterValues

コマンドレットの既定のエンコードを指定する。

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

リダイレクト演算子(>>>)はOut-File コマンドレットを呼び出す(PowerShell 5.1 以降)ため、リダイレクト時のエンコードを指定する意味となる。

Encoding パラメータのあるコマンドレットには以下がある。

  • Microsoft.PowerShell.Management
    • Add-Content
    • Get-Content
    • Set-Content
  • Microsoft.PowerShell.Utility
    • Export-Clixml
    • Export-Csv
    • Export-PSSession
    • Format-Hex
    • Import-Csv
    • Out-File
    • Select-String
    • Send-MailMessage

これらを一括して設定するには以下のようにできる。

$PSDefaultParameterValues['*:Encoding'] = 'utf8'