az ANSI terminálokról

Rövid leírás

Az ANSI-feloldási sorozatok PowerShellben elérhető támogatását ismerteti.

Hosszú leírás

A PowerShell számos olyan funkcióval rendelkezik, amelyek támogatják az ANSI-feloldó szekvenciák használatát a Kimenet renderelésének szabályozásához a PowerShellt futtató terminálalkalmazásban.

A PowerShell 7.2 új automatikus változót, $PSStyleés módosításokat adott hozzá a PowerShell-motorhoz, hogy támogassa az ANSI által dekorált szöveg kimenetét.

ANSI-terminál támogatása

Az ANSI-funkciók úgy lettek kialakítva, hogy kompatibilisek legyenek az xterm-alapú terminálokkal. További információ: xterm a Wikipédiában.

Windows 10 és újabb verziók esetén a Windows Konzol Host xterm kompatibilis. A Windows Terminál alkalmazás xterm kompatibilis is.

MacOS rendszeren az alapértelmezett terminálalkalmazás xterm kompatibilis.

Linux esetén minden disztribúció más terminálalkalmazással rendelkezik. A megfelelő terminálalkalmazás megkereséséhez tekintse meg a disztribúció dokumentációját.

$PSStyle

A változó a következő tulajdonságokkal rendelkezik:

  • alaphelyzetbe állítása – Az összes dekoráció kikapcsolása
  • Villogás – Villogás bekapcsolása
  • BlinkOff – A Villogás kikapcsolása
  • Félkövér – Félkövér mód bekapcsolása
  • BoldOff – Félkövér kikapcsolása
  • Dim – Bekapcsolja a Dim (a PowerShell 7.4-ben hozzáadva)
  • DimOff – A Dim kikapcsolása (a PowerShell 7.4-ben lett hozzáadva)
  • Rejtett – Bekapcsolja a rejtettet
  • HiddenOff – Elrejtés kikapcsolása
  • Reverse – Bekapcsolja a hátramenetet
  • ReverseOff – Kikapcsolja a fordított üzemmódot
  • Dőlt – Dőlt bekapcsolva
  • Dőlt betű kikapcsolása – Italics kikapcsolása
  • Aláhúzás – Az aláhúzás bekapcsolása
  • UnderlineOff – Az aláhúzás kikapcsolása
  • Áthúzás – Áthúzás bekapcsolása
  • StrikethroughOff – Az áthúzás kikapcsolása
  • OutputRendering – A kimenet renderelésének szabályozása
  • Formázás – Beágyazott objektum, amely a kimeneti streamek alapértelmezett formázását szabályozza
  • Progress – Beágyazott objektum, amely vezérli a folyamatjelző sávok megjelenítését
  • FileInfo – Beágyazott objektum FileInfo objektumok színezésének szabályozásához.
  • Előtérbeli – Beágyazott objektum az előtérszínezés szabályozásához
  • Háttér – Beágyazott objektum a háttérszínezés szabályozásához

Az alaptagok a nevükre leképezett ANSI-feloldósorozatok sztringeit adják vissza. Az értékek beállíthatók a testreszabás engedélyezéséhez. Például változtathat félkövérről aláhúzásra. A tulajdonságnevek megkönnyítik a dekorált sztringek létrehozását a tabulátorkiegészítés használatával:

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

Az ANSI-formázás használatát a következő tagok szabályozzák:

  • $PSStyle.OutputRendering egy System.Management.Automation.OutputRendering szám a következő értékekkel:

    • ANSI: Az ANSI menekülési szekvenciák mindig átmennek as-is-en.

      Fontos

      ANSI módot kell használnia, amikor a kimenetet átirányítja egy fájlba vagy a folyamatba, amelyet az alsóbb rétegben kíván végrehajtani. Ez biztosítja, hogy a kimenet ne változik. Bármely más mód használata megváltoztatja a kimenetet az ANSI-feloldási sorozatok eltávolításával, ami megváltoztathatja a végrehajtási viselkedést.

    • PlainText: Az ANSI-feloldósorozatok mindig le vannak vetve, hogy csak egyszerű szöveg legyen. Távoli munkamenetekben, ha a távoli gazdagép PlainText-ra van beállítva, a kimenetet megtisztítják az ANSI vezérlőkarakterektől, mielőtt azt visszaküldenék a helyi ügyfélnek. Ez a mód eltávolítja a szövegformázást és a megjelenítési sorozatokat. Ez nem egy átfogó terminálvezérlési fertőtlenítő mechanizmus.

    • Host: Ez az alapértelmezett viselkedés. A rendszer eltávolítja az ANSI-escape szekvenciákat az átirányított vagy csővezérelt kimenetről. További információkért lásd a Kimenet átirányítása.

  • A $PSStyle.Background és $PSStyle.Foreground tagok olyan karakterláncok, amelyek a 16 standard konzolszín ANSI-vezérlési sorozatait tartalmazzák.

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

    Az értékek beállíthatók, és tetszőleges számú ANSI-feloldási sorozatot tartalmazhatnak. A 24 bites szín megadására egy FromRgb() metódus is létezik. Kétféleképpen hívhatja meg a FromRgb() metódust.

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

    Az alábbi példák bármelyike beállítja a háttérszínt a 24 bites színkód szerint: "Beige".

    $PSStyle.Background.FromRgb(245, 245, 220)
    $PSStyle.Background.FromRgb(0xf5f5dc)
    
  • $PSStyle.Formatting egy beágyazott objektum, amely a hibakereső, hibajelentő, részletes és figyelmeztető üzenetek, valamint a lista- és táblázatfejlécek alapértelmezett formázását szabályozza. Olyan attribútumokat is szabályozhat, mint a félkövér és aláhúzás. A $Host.PrivateData váltja fel a színek kezelésének módját a formázási megjelenítésben. $Host.PrivateData továbbra is létezik a visszamenőleges kompatibilitás érdekében, de nincs csatlakoztatva $PSStyle.Formatting-hez. $PSStyle.Formatting tagjai a következők:

    • FormatAccent – listaelemek formázása
    • ErrorAccent – a hiba metaadatainak formázása
    • hiba – a hibaüzenetek formázása
    • Figyelmeztető – a figyelmeztető üzenetek formázása
    • Részletes – részletes üzenetek formázása
    • Hibakeresési – a hibakeresési üzenetek formázása
    • TableHeader – táblázatfejlécek formázása
    • CustomTableHeaderLabel – olyan táblázatfejlécek formázása, amelyek nem az objektumhoz tartozó tulajdonságok
    • FeedbackName – a visszajelzésszolgáltató nevének formázása (a PowerShell 7.4 kísérleti funkciójaként hozzáadva)
    • FeedbackText – visszajelzési üzenetek formázása (kísérleti funkcióként hozzáadva a PowerShell 7.4-ben)
    • FeedbackAction – a visszajelzésszolgáltató által javasolt műveletek formázása (a PowerShell 7.4 kísérleti funkciójaként hozzáadva)
  • A $PSStyle.Progress lehetővé teszi a folyamatjelző sáv megjelenítésének vezérlését.

    • Stílus – A renderelési stílust egy ANSI-sztring állítja be.
    • MaxWidth – A nézet maximális szélességének beállítása. Alapértelmezés szerint 120. A minimális érték 18.
    • megtekintése – Értékeket, Minimal és Classictartalmazó szám. Classic a meglévő, módosítások nélküli renderelés. Minimal egyetlen sor minimális renderelése. Az alapértelmezett Minimal.
    • UseOSCIndicator – Alapértelmezettként $false. Állítsa ezt $true értékre azoknál a termináloknál, amelyek támogatják az OSC mutatókat.

    Jegyzet

    Ha a gazdagép nem támogatja a Virtuális terminált, $PSStyle.Progress.View automatikusan Classic-re állítódik.

    Az alábbi példa minimális folyamatjelző sávra állítja a megjelenítési stílust.

    $PSStyle.Progress.View = 'Minimal'
    
  • $PSStyle.FileInfo beágyazott objektum, amely FileInfo objektumok színezését szabályozza.

    • Címtár – Beépített tag a címtárak színének megadásához

    • SymbolicLink – Beépített tag a szimbolikus hivatkozások színének megadásához

    • Futtatható – Beépített tag a futtatható fájlok színének megadásához.

    • bővítmény – Ezzel a tag használatával definiálhat színeket a különböző fájlkiterjesztésekhez. A bővítménytag előre definiálja az archív és PowerShell-fájlkiterjesztések színeit.

      Az alábbi példa bemutatja, hogyan módosíthatja a különböző FileInfo beállítások és fájlkiterjesztések színét. A színek úgy vannak kiválasztva, hogy jól működjenek a világos terminál hátterében.

      $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
      

ANSI-kimenetet létrehozó parancsmagok

  • A Markdown-parancsmagok – a Show-Markdown parancsmag megjeleníti a Markdown-szöveget tartalmazó fájl tartalmát. A kimenet ANSI-szekvenciák használatával jelenik meg a különböző stílusok megjelenítéséhez. A stílusok definícióit a Get-MarkdownOption és Set-MarkdownOption parancsmagokkal kezelheti.
  • PSReadLine-parancsmagok – a PSReadLine modul ANSI-szekvenciák használatával színezi a PowerShell-szintaxis elemeit a parancssorban. A színek Get-PSReadLineOption és Set-PSReadLineOptionhasználatával kezelhetők.
  • Get-Error – a Get-Error parancsmag részletes nézetet ad vissza egy hiba objektumról, amely úgy van formázva, hogy könnyebben olvasható legyen.
  • Select-String – A PowerShell 7.0-tól kezdődően Select-String ANSI-sorozatokkal emeli ki a kimenetben lévő egyező mintákat.
  • Write-Progress – Az ANSI-kimenet kezelése a fent leírt $PSStyle.Progresshasználatával történik. További információkért lásd: Write-Progress

Kimenet átirányítása gazdagép módban

Alapértelmezés szerint a $PSStyle.OutputRendering be van állítva a gazdagépre. A rendszer eltávolítja az ANSI-escape szekvenciákat az átirányított vagy csővezérelt kimenetről.

OutputRendering csak a gazda, Out-Fileés Out-Stringrenderelésére vonatkozik. A natív végrehajtható fájlok kimenetét nem érinti.

A PowerShell 7.2.6 módosította a Out-File és a Out-String viselkedését a következő forgatókönyvek esetében:

  • Ha a bemeneti objektum tiszta sztring, ezek a parancsmagok a OutputRendering beállítástól függetlenül változatlanul tartják a sztringet.
  • Ha a bemeneti objektumra formázási nézetet kell alkalmazni, ezek a parancsmagok a OutputRendering beállítás alapján megőrzik vagy eltávolítják a formázási kimenet sztringjeinek menekülési sorozatait.

Ez a powershell 7.2-hez képest a parancsmagok kompatibilitástörő változása.

A OutputRendering nem vonatkozik a PowerShell-gazdagép folyamatának kimenetére, például ha a pwsh-t parancssorból futtatja, és átirányítja a kimenetet.

Az alábbi példában a PowerShell a bash-n keresztül fut Linuxon. A Get-ChildItem parancsmag ANSI-sel dekorált szöveget hoz létre. Mivel az átirányítás a bash folyamatban történik a PowerShell környezeten kívül, ezért a kimenetet nem befolyásolja a OutputRendering.

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

A out.txt tartalmának vizsgálatakor megjelennek az ANSI-feloldási sorozatok.

Ezzel szemben, ha az átirányítás a PowerShell-munkameneten belül történik, OutputRendering befolyásolja az átirányított kimenetet.

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

A out.txt tartalmának vizsgálatakor nincsenek ANSI-feloldási sorozatok.

ANSI-kimenet letiltása

Az ANSI-feloldósorozatok támogatása kikapcsolható a TERM vagy NO_COLOR környezeti változók használatával.

A $Env:TERM alábbi értékei az alábbiak szerint módosítják a viselkedést:

  • dumb$Host.UI.SupportsVirtualTerminal = $false beállítása
  • xterm-mono$PSStyle.OutputRendering = PlainText beállítása
  • xterm$PSStyle.OutputRendering = PlainText beállítása

Ha $Env:NO_COLOR létezik, akkor a $PSStyle.OutputRendering be van állítva a PlainTextértékre. A NO_COLOR környezeti változóval kapcsolatos további információkért lásd: https://no-color.org/.

Használat $PSStyle a C-ből#

A C#-fejlesztők singletonként férhetnek hozzá a PSStyle-hoz, ahogyan az alábbi példában látható:

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

PSStyle létezik a System.Management.Automation névtérben.

A PowerShell-motor a következő módosításokat tartalmazza:

  • A PowerShell formázási rendszere a $PSStyle.OutputRenderingtiszteletben tartása érdekében frissül.
  • A StringDecorated típus hozzáadásra kerül az ANSI kódolt sztringek kezelésére.
  • A string IsDecorated logikai tulajdonság hozzáadva igaz visszaadásához, ha a sztring ESC vagy C1 CSI karaktersorozatokat tartalmaz.
  • Egy karakterlánc Length tulajdonsága visszaadja a szöveg hosszát az ANSI vezérlősorozatok nélkül.
  • A StringDecorated Substring(int contentLength) metódus egy 0 indextől kezdődő részszúrást ad vissza az ANSI-feloldósorozatok részét nem képező tartalomhosszig. Erre azért van szükség, hogy a táblázatok formázása során a szövegrészek csonkításra kerüljenek, és megmaradjanak azok az ANSI vezérlősorozatok, amelyek nem foglalnak el nyomtatható karakterhelyet.
  • A string ToString() metódus változatlan marad, és visszaadja a sztring egyszerű szöveges verzióját.
  • A string ToString(bool Ansi) metódus a nyers ANSI-beágyazott sztringet adja vissza, ha a Ansi paraméter igaz. Ellenkező esetben a rendszer egy egyszerű szöveges verziót ad vissza, amely eltávolítja az ANSI-feloldási sorozatokat.
  • A FormatHyperlink(string text, uri link) metódus egy olyan sztringet ad vissza, amely ANSI-feloldósorozatokat tartalmaz a hivatkozások díszítéséhez. Egyes terminál programok, például a Windows Terminál, támogatják ezt a jelölést, ami a terminálban megjelenített szöveget kattinthatóvá teszi.

A PSStyle osztály statikus metódusai

A PowerShell 7.4 három új statikus metódust ad hozzá a [System.Management.Automation.PSStyle] osztályhoz.

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

Ezek a módszerek lehetővé teszik ConsoleColor értékeinek anSI-feloldósorozattá alakítását előtér- és háttérszínek, illetve mindkettő kombinációjához.

Az alábbi példák az ezen módszerek által előállított ANSI-feloldási sorozatokat mutatják be.

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

Lásd még