🎨

【PowerShell】$PSStyle のエスケープシーケンスが出力されないようにする

2022/05/28に公開

対象:PowerShell 7.2 ~

PowerShell 7.2 から、コマンド出力がカラフルなりました。

これは ANSI エスケープシーケンスを利用しているそうで、scbSet-Clipboard のエイリアス)でコピーするとそれらの制御文字まで含まれてしまいます。


[32;1mName                           Value[0m
[32;1m----                           -----[0m
PSVersion                      7.2.4
PSEdition                      Core
GitCommitId                    7.2.4
OS                             Microsoft Windows 10.0.19044
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

※補足: ossOut-String -stream に相当する組み込み関数。オブジェクトをターミナルに表示されている整形済みの状態でそのまま文字列としてパイプライン下流に渡してくれます。

どうすればいいか

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_ansi_terminals?view=powershell-7.2

出力への色付けは $PSStyle.OutputRendering で制御できます。


モノクロ表示になっている!

もうひと工夫

もうちょっと詳しくみると、ここで指定する PlainTextANSI[System.Management.Automation.OutputRendering] 型のようです。

> $PSStyle.OutputRendering.GetType().FullName
System.Management.Automation.OutputRendering

その都度入力して切り替えるのも手間なのでラップしてみました。

function Stop-PsStyleRendering {
    $global:PSStyle.OutputRendering = [System.Management.Automation.OutputRendering]::PlainText
}

function Start-PsStyleRendering {
    $global:PSStyle.OutputRendering = [System.Management.Automation.OutputRendering]::Ansi
}

関数スコープのなかから参照するためには $global:PSStyle のようにしてグローバル関数であることを明示してやればOKです。

Discussion