はじめに
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'