Sdílet prostřednictvím


o terminálech ANSI

Krátký popis

Popisuje podporu řídicích sekvencí ANSI v PowerShellu.

Dlouhý popis

PowerShell má mnoho funkcí, které podporují použití řídicích sekvencí ANSI k řízení vykreslování výstupu v terminálové aplikaci, která je hostitelem PowerShellu.

PowerShell 7.2 přidal novou automatickou proměnnou $PSStylea provedl změny v modulu PowerShell k podpoře výstupu textu s podporou ANSI.

Podpora terminálu ANSI

Funkce ANSI jsou navrženy tak, aby byly kompatibilní s terminály založenými na Xterm. Další informace naleznete v tématu xterm na Wikipedii.

V systému Windows 10 a vyšší je hostitel konzoly systému Windows kompatibilní s xterm. Aplikace Windows Terminal je také kompatibilní s xterm.

V systému macOS je výchozí terminálová aplikace kompatibilní s xterm.

Pro Linux se každá distribuce dodává s jinou terminálovou aplikací. V dokumentaci k distribuci vyhledejte vhodnou terminálovou aplikaci.

$PSStyle

Proměnná má následující vlastnosti:

  • Resetovat - Vypne všechny dekorace
  • Blink – zapne blikání
  • BlinkOff – vypne blikání
  • Tučné písmo – Zapne tučné písmo.
  • BoldOff – vypne tučné písmo
  • Dim – zapne funkci Dim (přidáno v PowerShellu 7.4)
  • DimOff – Vypne funkci stmívání (přidáno v PowerShellu 7.4)
  • Skrytý – zapne skryté
  • HiddenOff – vypne skrytí
  • Obrácení – zapne obrácení
  • ReverseOff – vypne funkci zpětného chodu
  • Kurzíva – Zapne kurzívu
  • vypnutí kurzívy – vypne kurzívu
  • Podtržení – zapnutí podtržení
  • Vypnutí Podtržení – vypne podtržení.
  • Přeškrtnutí – zapne přeškrtnutí
  • Vypnutí přeškrtnutí – vypne přeškrtnutí
  • OutputRendering – určuje, kdy se používá vykreslování výstupu.
  • Formátování – vnořený objekt, který řídí výchozí formátování výstupních datových proudů
  • Progress – Vnořený objekt, který řídí vykreslování indikátorů průběhu
  • FileInfo – vnořený objekt pro řízení barvení objektů FileInfo.
  • Popředí – Vnořený objekt pro ovládání barvy popředí
  • pozadí – vnořený objekt pro řízení barvení pozadí

Základní členové vracejí řetězce řídicích sekvencí ANSI mapovaných na jejich názvy. Hodnoty jsou nastavené tak, aby umožňovaly přizpůsobení. Můžete například změnit tučné písmo na podtržené. Názvy vlastností usnadňují vytváření zdobených řetězců pomocí dokončování tabulátoru:

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

Následující členové určují, jak nebo kdy se používá formátování ANSI:

  • $PSStyle.OutputRendering je výčet System.Management.Automation.OutputRendering s hodnotami:

    • ANSI: Řídicí sekvence ANSI vždy procházejí as-is.

      Důležitý

      Při přesměrování výstupu do souboru nebo kanálu, který má být zpracován dále po proudu, byste měli použít režim ANSI. Tím se zajistí, že se výstup nezmění. Použití jakéhokoli jiného režimu změní výstup odebráním řídicích sekvencí ANSI, které mohou změnit způsob provádění.

    • PlainText: Řídicí sekvence ANSI jsou vždy odstraněny, aby zůstal pouze prostý text. Pokud je ve vzdálených relacích vzdálený hostitel nastaven na PlainText, výstup je před odesláním zpět do místního klienta zbaven řídicích sekvencí ANSI.

    • Host: Toto je výchozí chování. Řídicí sekvence ANSI se odeberou z přesměrovaného nebo potrubního výstupu. Další informace naleznete v tématu Přesměrování výstupu.

  • Členy $PSStyle.Background a $PSStyle.Foreground jsou řetězce, které obsahují escape sekvence ANSI pro 16 standardních konzolových barev.

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

    Hodnoty jsou nastavitelné a mohou obsahovat libovolný počet řídicích sekvencí ANSI. Existuje také FromRgb() metoda pro určení 24bitové barvy. Existují dva způsoby volání metody FromRgb().

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

    Některý z následujících příkladů nastavil barvu pozadí 24bitovou barvu Beige.

    $PSStyle.Background.FromRgb(245, 245, 220)
    $PSStyle.Background.FromRgb(0xf5f5dc)
    
  • $PSStyle.Formatting je vnořený objekt pro řízení výchozího formátování ladicích, chybových, podrobných a výstražných zpráv, a také záhlaví seznamů a tabulek. Můžete také řídit atributy, jako je tučné písmo a podtržení. Nahrazuje $Host.PrivateData jako způsob správy barev pro vykreslování formátování. $Host.PrivateData nadále existuje kvůli zpětné kompatibilitě, ale není připojen k $PSStyle.Formatting. $PSStyle.Formatting má následující členy:

    • FormatAccent – formátování položek seznamu
    • ErrorAccent – formátování metadat chyb
    • Chyba – formátování chybových zpráv
    • Varování – formátování varovných zpráv
    • Detailní – formátování detailních zpráv
    • ladění – formátování ladicích zpráv
    • TableHeader – formátování záhlaví tabulky
    • CustomTableHeaderLabel – formátování pro záhlaví tabulky, která ve skutečnosti nemají vlastnosti objektu
    • FeedbackName – formátování názvu poskytovatele zpětné vazby (přidané jako experimentální funkce v PowerShellu 7.4)
    • FeedbackText – formátování zpráv zpětné vazby (přidáno jako experimentální funkce v PowerShellu 7.4)
    • FeedbackAction – formátování navrhovaných akcí poskytovatele zpětné vazby (přidané jako experimentální funkce v PowerShellu 7.4)
  • $PSStyle.Progress umožňuje řídit vykreslování pruhů zobrazení průběhu.

    • Styl – řetězec ANSI, který nastavuje styl vykreslování.
    • MaxWidth – nastaví maximální šířku zobrazení. Výchozí hodnota je 120. Minimální hodnota je 18.
    • Zobrazit – výčet s hodnotami, Minimal a Classic. Classic je stávající vykreslování beze změn. Minimal je jednařádkové minimální vykreslení. Minimal je výchozí.
    • UseOSCIndicator – nastavuje se na výchozí hodnotu $false. Nastavte tuto možnost na $true pro terminály, které podporují indikátory OSC.

    Poznámka

    Pokud hostitel nepodporuje virtuální terminál, $PSStyle.Progress.View se automaticky nastaví na Classic.

    Následující příklad nastaví styl vykreslování na minimální indikátor průběhu.

    $PSStyle.Progress.View = 'Minimal'
    
  • $PSStyle.FileInfo je vnořený objekt pro kontrolu barvení objektu FileInfo.

    • Adresář – předdefinovaný člen pro určení barvy adresářů

    • Symbolický odkaz – předdefinovaný člen pro určení barvy symbolických odkazů

    • spustitelný soubor – integrovaný člen, který určuje barvu spustitelných souborů.

    • Extension – Tento člen slouží k definování barev pro různé přípony souborů. Člen rozšíření předdefinuje barvy pro archivaci a přípony souborů PowerShellu.

      Následující příklad ukazuje, jak změnit barvy pro různá FileInfo nastavení a konkrétní přípony souborů. Barvy jsou zvoleny tak, aby dobře fungovaly na světlém pozadí terminálu.

      $PSStyle.FileInfo.Directory = $PSStyle.Background.FromRgb(0x2f6aff) +
          $PSStyle.Foreground.BrightWhite
      $PSStyle.FileInfo.SymbolicLink = $PSStyle.Foreground.Cyan
      $PSStyle.FileInfo.Executable = $PSStyle.Foreground.BrightMagenta
      $PSStyle.FileInfo.Extension['.ps1'] = $PSStyle.Foreground.Cyan
      $PSStyle.FileInfo.Extension['.ps1xml'] = $PSStyle.Foreground.Cyan
      $PSStyle.FileInfo.Extension['.psd1'] = $PSStyle.Foreground.Cyan
      $PSStyle.FileInfo.Extension['.psm1'] = $PSStyle.Foreground.Cyan
      

Rutiny, které generují výstup ANSI

  • Rutiny Markdownu – rutina Show-Markdown zobrazí obsah souboru obsahujícího text markdownu. Výstup se vykreslí pomocí sekvencí ANSI, které představují různé styly. Definice stylů můžete spravovat pomocí rutin Get-MarkdownOption a Set-MarkdownOption.
  • Rutiny PSReadLine – modul PSReadLine používá sekvence ANSI k obarvení elementů syntaxe PowerShellu na příkazovém řádku. Barvy lze spravovat pomocí Get-PSReadLineOption a Set-PSReadLineOption.
  • Get-Error – rutina Get-Error vrátí podrobné zobrazení objektu Error, které usnadňuje čtení.
  • Select-String – Počínaje PowerShellem 7.0 Select-String používá ANSI sekvence ke zvýraznění odpovídajících vzorů ve výstupu.
  • Write-Progress – výstup ANSI se spravuje pomocí $PSStyle.Progress, jak je popsáno výše. Další informace najdete v tématu Write-Progress.

Přesměrování výstupu v režimu hostitele

Ve výchozím nastavení je $PSStyle.OutputRendering nastaveno na Hostitel. Řídicí sekvence ANSI se odeberou z přesměrovaného nebo potrubního výstupu.

OutputRendering platí pouze pro vykreslování v hostiteli, Out-Filea Out-String. Výstup z nativních spustitelných souborů není ovlivněn.

PowerShell 7.2.6 změnil chování Out-File a Out-String pro následující scénáře:

  • Pokud je vstupní objekt čistým řetězcem, tyto rutiny zachovávají řetězec bez ohledu na nastavení OutputRendering.
  • Když je zapotřebí použít formátovací zobrazení na vstupní objekt, tyto rutiny zachovají nebo odeberou escape sekvence z výstupních řetězců formátování na základě nastavení OutputRendering.

Jedná se o zásadní změnu v těchto rutinách v porovnání s PowerShellem 7.2.

OutputRendering se nevztahuje na výstup z hostitelského procesu PowerShellu, například při spuštění pwsh z příkazového řádku a přesměrování výstupu.

V následujícím příkladu se PowerShell spouští v Linuxu z bash. Cmdlet Get-ChildItem vytváří text s ANSI dekorací. Protože přesměrování probíhá v procesu bash mimo hostitele PowerShellu, není výstup ovlivněn OutputRendering.

pwsh -NoProfile -Command 'Get-ChildItem' > out.txt

Při kontrole obsahu out.txt se zobrazí řídicí sekvence ANSI.

Naproti tomu pokud dojde k přesměrování v rámci relace PowerShellu, OutputRendering ovlivňuje přesměrovaný výstup.

pwsh -NoProfile -Command 'Get-ChildItem > out.txt'

Při kontrole obsahu out.txt nenajdete žádné řídicí sekvence ANSI.

Zakázání výstupu ANSI

Podporu řídicích sekvencí ANSI lze vypnout nastavením proměnných prostředí TERM nebo NO_COLOR.

Následující hodnoty $Env:TERM mění chování následujícím způsobem:

  • dumb – nastaví $Host.UI.SupportsVirtualTerminal = $false
  • xterm-mono – nastaví $PSStyle.OutputRendering = PlainText
  • xterm – nastaví $PSStyle.OutputRendering = PlainText

Pokud $Env:NO_COLOR existuje, je $PSStyle.OutputRendering nastavena na PlainText. Další informace o proměnné prostředí NO_COLOR naleznete v tématu https://no-color.org/.

Použití z jazyka $PSStyle C#

Vývojáři jazyka C# mohou přistupovat k PSStyle jako singleton, jak je znázorněno v následujícím příkladu:

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

PSStyle existuje v oboru názvů System.Management.Automation.

Modul PowerShellu obsahuje následující změny:

  • Systém formátování PowerShellu se aktualizuje tak, aby respektoval $PSStyle.OutputRendering.
  • Typ StringDecorated je přidán pro zpracování eskapovaných řetězců ANSI.
  • Byla přidána string IsDecorated logická vlastnost k vrácení true, když řetězec obsahuje sekvence znaků ESC nebo C1 CSI.
  • Vlastnost Length řetězce vrátí délku textu bez řídicích sekvencí ANSI.
  • Metoda StringDecorated Substring(int contentLength) vrací podřetězec začínající indexem 0 a pokračující až po délku obsahu, která neobsahuje posloupnosti únikových sekvencí ANSI. To je potřeba pro formátování tabulky, aby se zkrátily řetězce a zachovaly řídicí sekvence ANSI, které nezabírají místo pro tisknutelné znaky.
  • Metoda string ToString() zůstane stejná a vrátí verzi řetězce ve formátu prostého textu.
  • Metoda string ToString(bool Ansi) vrátí nezpracovaný vložený řetězec ANSI, pokud je parametr Ansitrue. V opačném případě se vrátí verze prostého textu s odebranými řídicími sekvencemi ANSI.
  • Metoda FormatHyperlink(string text, uri link) vrátí řetězec, který obsahuje ANSI únikové sekvence používané k ozdobení hypertextových odkazů. Někteří hostitelé terminálu, jako je Terminál systému Windowspodporují tento kód, díky čemuž je vykreslený text v terminálu klikací.

Statické metody třídy PSStyle

PowerShell 7.4 přidá do třídy [System.Management.Automation.PSStyle] tři nové statické metody.

[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)

Tyto metody poskytují způsob, jak převést ConsoleColor hodnoty na řídicí sekvence ANSI pro barvy popředí a pozadí nebo pro kombinaci obojího.

Následující příklady ukazují ANSI únikové sekvence vytvořené těmito metodami.

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

Viz také