次の方法で共有


about_ANSI_Terminals

簡単な説明

PowerShell で ANSI エスケープ シーケンスで使用できるサポートについて説明します。

詳細な説明

PowerShell には、PowerShell をホストしているターミナル アプリケーションでの出力のレンダリングを制御するための ANSI エスケープ シーケンスの使用をサポートする多くの機能があります。

PowerShell 7.2 では、ANSI 装飾テキストの出力をサポートするために、PowerShell エンジンに新しい自動変数、 $PSStyle、および変更が追加されました。

ANSI ターミナルのサポート

ANSI 機能は、xterm ベースのターミナルと互換性のあるものに設計されています。 詳細については、Wikipedia の xterm を参照してください。

Windows 10 以降では、Windows コンソール ホストは xterm 互換です。 Windows ターミナル アプリケーションも xterm 互換です。

macOS では、既定のターミナル アプリケーションは xterm 互換です。

Linux の場合、各ディストリビューションには異なるターミナル アプリケーションが付属しています。 適切なターミナル アプリケーションを見つけるには、ディストリビューションのドキュメントを参照してください。

$PSStyle

変数には、次のプロパティがあります。

  • リセット - すべての装飾をオフにします
  • 点滅 - 点滅をオンにします
  • BlinkOff - 点滅をオフにします
  • 太字 - 太字をオンにします
  • BoldOff - 太字をオフにします
  • Dim - Dim をオンにします (PowerShell 7.4 で追加)
  • DimOff - Dim をオフにします (PowerShell 7.4 で追加)
  • 非表示 - 非表示をオンにします
  • HiddenOff - 非表示をオフにします
  • 反転 - 反転をオンにします
  • ReverseOff - 反転をオフにします
  • 斜体 - 斜体をオンにします
  • ItalicOff - 斜体をオフにします
  • 下線 - 下線をオンにします
  • UnderlineOff - 下線をオフにします
  • 取り消し線 - 取り消し線をオンにします
  • StrikethroughOff - 取り消し線をオフにします
  • OutputRendering - 出力レンダリングを使用するタイミングを制御する
  • 書式設定 - 出力ストリームの既定の書式設定を制御する入れ子になったオブジェクト
  • Progress - 進行状況バーのレンダリングを制御する入れ子になったオブジェクト
  • FileInfo - FileInfo オブジェクトの色分けを制御する入れ子になったオブジェクト。
  • Foreground - 前景の色分けを制御する入れ子になったオブジェクト
  • 背景 - 背景の色分けを制御する入れ子になったオブジェクト

基本メンバーは、名前にマップされた ANSI エスケープ シーケンスの文字列を返します。 値は、カスタマイズできるように設定できます。 たとえば、太字を下線付きに変更できます。 プロパティ名を使用すると、タブ補完を使用して修飾文字列を簡単に作成できます。

"$($PSStyle.Background.BrightCyan)Power$($PSStyle.Underline)$($PSStyle.Bold)Shell$($PSStyle.Reset)"

次のメンバーは、ANSI 書式を使用する方法とタイミングを制御します。

  • $PSStyle.OutputRendering は、値を持つ System.Management.Automation.OutputRendering 列挙型です。

    • ANSI: ANSI エスケープ シーケンスは常にそのまま渡されます。

      重要

      出力をダウンストリームで実行することを目的としたファイルまたはパイプラインにリダイレクトする場合は、 ANSI モードを使用する必要があります。 これにより、出力が変更されないようにします。 他のモードを使用すると、ANSI エスケープ シーケンスを削除することで出力が変更され、実行動作が変更される可能性があります。

    • PlainText: ANSI エスケープ シーケンスは常に削除され、プレーン テキストのみになります。 リモート セッションでは、リモート ホストが PlainText に設定されている場合、出力はローカル クライアントに送り返す前に ANSI エスケープ シーケンスから削除されます。

    • Host: これが既定の動作です。 ANSI エスケープ シーケンスは、リダイレクトまたはパイプ出力から削除されます。 詳細については、「 出力のリダイレクト」を参照してください。

  • $PSStyle.Backgroundおよび$PSStyle.Foregroundメンバーは、16 色の標準コンソールの ANSI エスケープ シーケンスを含む文字列です。

    • Black
    • BrightBlack
    • White
    • BrightWhite
    • Red
    • BrightRed
    • Magenta
    • BrightMagenta
    • Blue
    • BrightBlue
    • Cyan
    • BrightCyan
    • Green
    • BrightGreen
    • Yellow
    • BrightYellow

    値は設定可能であり、任意の数の ANSI エスケープ シーケンスを含めることができます。 24 ビットの色を指定する FromRgb() メソッドもあります。 FromRgb() メソッドを呼び出すには、2 つの方法があります。

    string FromRgb(byte red, byte green, byte blue)
    string FromRgb(int rgb)
    

    次の例では、24 ビットカラー Beigeの背景色を設定します。

    $PSStyle.Background.FromRgb(245, 245, 220)
    $PSStyle.Background.FromRgb(0xf5f5dc)
    
  • $PSStyle.Formatting は、デバッグ、エラー、詳細、警告メッセージ、およびリストおよびテーブル ヘッダーの既定の書式設定を制御する入れ子になったオブジェクトです。 太字や下線などの属性を制御することもできます。 $Host.PrivateDataは、レンダリングの書式設定の色を管理する方法として置き換えられます。 $Host.PrivateData は下位互換性のために存在し続けますが、 $PSStyle.Formattingに接続されていません。 $PSStyle.Formatting には、次のメンバーがあります。

    • FormatAccent - リスト アイテムの書式設定
    • ErrorAccent - エラー メタデータの書式設定
    • エラー - エラー メッセージの書式設定
    • 警告 - 警告メッセージの書式設定
    • Verbose - 詳細メッセージの書式設定
    • デバッグ - デバッグ メッセージの書式設定
    • TableHeader - テーブル ヘッダーの書式設定
    • CustomTableHeaderLabel - オブジェクトの実際のプロパティではないテーブル ヘッダーの書式設定
    • FeedbackName - フィードバック プロバイダー名の書式設定 (PowerShell 7.4 の実験用機能として追加)
    • FeedbackText - フィードバック メッセージの書式設定 (PowerShell 7.4 の実験用機能として追加)
    • FeedbackAction - フィードバック プロバイダーが推奨するアクションの書式設定 (PowerShell 7.4 の実験用機能として追加)
  • $PSStyle.Progress では、進行状況ビュー バーのレンダリングを制御できます。

    • スタイル - レンダリング スタイルを設定する ANSI 文字列。
    • MaxWidth - ビューの最大幅を設定します。 既定値は 120 です。 最小値は 18 です。
    • ビュー - 値、 MinimalClassicを含む列挙型。 Classic は変更なしの既存の表示です。 Minimal は単一行の最小表示です。 Minimal は既定値です。
    • UseOSCIndicator - 既定値は $false です。 OSC インジケーターをサポートする端末の $true に設定します。

    Note

    ホストで仮想ターミナルがサポートされていない場合、$PSStyle.Progress.View は自動的に Classic に設定されます。

    次の使用例は、レンダリング スタイルを最小プログレス バーに設定します。

    $PSStyle.Progress.View = 'Minimal'
    
  • $PSStyle.FileInfo は、 FileInfo オブジェクトの色分けを制御する入れ子になったオブジェクトです。

    • ディレクトリ - ディレクトリの色を指定する組み込みメンバー
    • SymbolicLink - シンボリック リンクの色を指定する組み込みメンバー
    • Executable - 実行可能ファイルの色を指定する組み込みメンバー。
    • 拡張機能 - このメンバーを使用して、さまざまなファイル拡張子の色を定義します。 Extension メンバーには、アーカイブと PowerShell ファイルの拡張機能があらかじめ含まれています。

ANSI 出力を生成するコマンドレット

  • markdown コマンドレット - Show-Markdown コマンドレットは、マークダウン テキストを含むファイルの内容を表示します。 出力は、さまざまなスタイルを表すために ANSI シーケンスを使用してレンダリングされます。 スタイルの定義は、 Get-MarkdownOption および Set-MarkdownOption コマンドレットを使用して管理できます。
  • PSReadLine コマンドレット - PSReadLine モジュールは ANSI シーケンスを使用して、コマンド ラインで PowerShell 構文要素を色分けします。 色は、 Get-PSReadLineOption および Set-PSReadLineOption を使用して管理できます。
  • Get-Error - Get-Error コマンドレットは、読みやすくするために書式設定された Error オブジェクトの詳細ビューを返します。
  • Select-String - PowerShell 7.0 以降では、 Select-String は ANSI シーケンスを使用して出力内の一致パターンを強調表示します。
  • Write-Progress - ANSI 出力は、前述のように、 $PSStyle.Progressを使用して管理されます。 詳細については、「 Write-Progress」を参照してください。

Host モードでの出力のリダイレクト

既定では、 $PSStyle.OutputRenderingHost に設定されます。 ANSI エスケープ シーケンスは、リダイレクトまたはパイプ出力から削除されます。

OutputRendering は、ホスト、 Out-File、および Out-Stringでのレンダリングにのみ適用されます。 ネイティブ実行可能ファイルからの出力は影響を受けません。

PowerShell 7.2.6 では、次のシナリオで Out-FileOut-String の動作が変更されました。

  • 入力オブジェクトが純粋な文字列の場合、これらのコマンドレットは、 OutputRendering 設定に関係なく、文字列を変更しません。
  • 入力オブジェクトに書式設定ビューを適用する必要がある場合、これらのコマンドレットは、 OutputRendering 設定に基づいて、書式設定出力文字列のエスケープ シーケンスを保持または削除します。

これは、PowerShell 7.2 と比較して、これらのコマンドレットの破壊的変更です。

OutputRendering は、コマンド ラインから pwsh を実行して出力をリダイレクトする場合など、PowerShell ホスト プロセスからの出力には適用されません。

次の例では、PowerShell は Linux 上で bash から実行されます。 Get-ChildItem コマンドレットは、ANSI で修飾されたテキストを生成します。 リダイレクトは、 bash プロセスで PowerShell ホストの外部で行われるため、出力は OutputRendering の影響を受けません。

pwsh -noprofile -command 'Get-Childitem' > out.txt

out.txtの内容を調べると、ANSI エスケープ シーケンスが表示されます。

これに対し、PowerShell セッション内でリダイレクトが行われると、 OutputRendering はリダイレクトされた出力に影響します。

pwsh -noprofile -command 'Get-Childitem > out.txt'

out.txtの内容を調べると、ANSI エスケープ シーケンスはありません。

ANSI 出力の無効化

ANSI エスケープ シーケンスのサポートは、TERM または NO_COLOR 環境変数を使用して無効にすることができます。

$env:TERM の次の値は、動作を次のように変更します。

  • dumb -設定 $Host.UI.SupportsVirtualTerminal = $false
  • xterm-mono -設定 $PSStyle.OutputRendering = PlainText
  • xtermm -設定 $PSStyle.OutputRendering = PlainText

$env:NO_COLORが存在する場合、$PSStyle.OutputRenderingPlainText に設定されます。 NO_COLOR環境変数の詳細については、「https://no-color.org/」を参照してください。

C からの $PSStyle の使用#

C# 開発者は、次の例に示すように、シングルトンとして PSStyle にアクセスできます。

string output = $"{PSStyle.Instance.Foreground.Red}{PSStyle.Instance.Bold}Hello{PSStyle.Instance.Reset}";

PSStyle は、System.Management.Automation 名前空間に存在します。

PowerShell エンジンには、次の変更が含まれています。

  • PowerShell の書式設定システムが、$PSStyle.OutputRendering を考慮するように更新されます。
  • ANSI エスケープ文字列を処理するために、 StringDecorated 型が追加されます。
  • 文字列にESCまたはC1 CSI文字シーケンスが含まれている場合にtrue を返すために、string IsDecoratedブール型プロパティが追加されました。
  • 文字列の Length プロパティは、ANSI エスケープ シーケンスのないテキストの長さを返します。
  • StringDecorated Substring(int contentLength) メソッドは、ANSI エスケープ シーケンスの一部ではないコンテンツ長までのインデックス 0 から始まる部分文字列を返します。 これは、テーブルの書式設定が文字列を切り捨て、印刷可能な文字領域を占有しない ANSI エスケープ シーケンスを保持するために必要です。
  • string ToString() メソッドは同じままで、文字列のプレーンテキスト バージョンを返します。
  • Ansi パラメーターがtrue の場合、string ToString(bool Ansi) メソッドは生の ANSI 埋め込み文字列。 それ以外の場合は、ANSI エスケープ シーケンスが削除されたプレーンテキスト バージョンが返されます。
  • FormatHyperlink(string text, uri link) メソッドは、ハイパーリンクを装飾するために使用される ANSI エスケープ シーケンスを含む文字列を返します。 Windows ターミナルなどの一部のターミナル ホストは、このマークアップをサポートしていて、これにより、レンダリングされたテキストがターミナルでクリック可能になります。

PSStyle クラスの静的メソッド

PowerShell 7.4 では、 [System.Management.Automation.PSStyle] クラスに 3 つの新しい静的メソッドが追加されます。

[System.Management.Automation.PSStyle] | Get-Member -Static -MemberType Method
   TypeName: System.Management.Automation.PSStyle

Name                               MemberType Definition
----                               ---------- ----------
Equals                             Method     static bool Equals(System.Object objA, System.Object objB)
MapBackgroundColorToEscapeSequence Method     static string MapBackgroundColorToEscapeSequence(System.ConsoleColor bac…
MapColorPairToEscapeSequence       Method     static string MapColorPairToEscapeSequence(System.ConsoleColor foregroun…
MapForegroundColorToEscapeSequence Method     static string MapForegroundColorToEscapeSequence(System.ConsoleColor for…
ReferenceEquals                    Method     static bool ReferenceEquals(System.Object objA, System.Object objB)

これらのメソッドは、前景色と背景色、または両方の組み合わせのために、 ConsoleColor 値を ANSI エスケープ シーケンスに変換する方法を提供します。

次の例は、これらのメソッドによって生成される ANSI エスケープ シーケンスを示しています。

using namespace System.Management.Automation
[PSStyle]::MapBackgroundColorToEscapeSequence('Black') | Format-Hex
   Label: String (System.String) <3A04954D>

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 1B 5B 34 30 6D                                  �[40m
[PSStyle]::MapForegroundColorToEscapeSequence('Red') | Format-Hex
   Label: String (System.String) <38B50F41>

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 1B 5B 39 31 6D                                  �[91m
[PSStyle]::MapColorPairToEscapeSequence('Red','Black') | Format-Hex
   Label: String (System.String) <365A5875>

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 1B 5B 39 31 3B 34 30 6D                         �[91;40m

関連項目