Condividi tramite


informazioni_su_ANSI_Terminali

Breve descrizione

Descrive il supporto disponibile per le sequenze di escape ANSI in PowerShell.

Descrizione lunga

PowerShell include molte funzionalità che supportano l'uso di sequenze di escape ANSI per controllare il rendering dell'output nell'applicazione terminale che ospita PowerShell.

PowerShell 7.2 ha aggiunto una nuova variabile automatica, $PSStylee le modifiche apportate al motore di PowerShell per supportare l'output di testo decorato con ANSI.

Supporto del terminale ANSI

Le funzionalità ANSI sono progettate per essere compatibili con i terminali basati su xterm. Per ulteriori informazioni, consultare xterm su Wikipedia.

In Windows 10 e versioni successive, l'host della console di Windows è compatibile con xterm. Anche l'applicazione terminale Windows è compatibile con xterm.

In macOS l'applicazione terminale predefinita è compatibile con xterm.

Per Linux, ogni distribuzione viene fornita con un'applicazione terminale diversa. Consultare la documentazione relativa alla distribuzione per trovare un'applicazione terminale appropriata.

$PSStyle

La variabile ha le proprietà seguenti:

  • Reimposta - Disattiva tutte le decorazioni
  • lampeggiare - Attiva il lampeggiamento
  • BlinkOff - Disattiva il lampeggiamento
  • Grassetto - Attiva il grassetto
  • BoldOff - Disattivazione del grassetto
  • Dim - Attiva Dim (aggiunta in PowerShell 7.4)
  • DimOff - Disattiva Dim (aggiunto in PowerShell 7.4)
  • nascosti - Attiva nascosto
  • HiddenOff - Disattiva la modalità nascosta
  • Reverse - Attiva l'inversione
  • reverseOff - Disattiva inverso
  • corsivo - Attiva corsivo
  • CorsivoOff - Disattiva corsivo
  • Sottolineato - Attiva la sottolineatura
  • UnderlineOff - Disattiva la sottolineatura
  • strikethrough - Attiva il colpo
  • StrikethroughOff - Disattiva il colpo
  • OutputRendering - Controllare quando viene eseguito il rendering dell'output
  • Formattazione - Oggetto annidato che controlla la formattazione predefinita per i flussi di output
  • Progresso - Oggetto annidato che controlla il rendering delle barre di progresso
  • FileInfo - oggetto annidato per controllare la colorazione degli oggetti FileInfo.
  • primo piano - Oggetto annidato per controllare la colorazione di primo piano
  • sfondo - Oggetto annidato per controllare la colorazione dello sfondo

I membri di base restituiscono stringhe di sequenze di escape ANSI mappate ai relativi nomi. I valori sono impostabili per consentire la personalizzazione. Ad esempio, è possibile modificare il grassetto in sottolineato. I nomi delle proprietà semplificano la creazione di stringhe decorate usando il completamento della scheda:

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

I membri seguenti controllano come o quando viene usata la formattazione ANSI:

  • $PSStyle.OutputRendering è un'enumerazione System.Management.Automation.OutputRendering con i valori seguenti:

    • ANSI: le sequenze di escape ANSI vengono sempre passate attraverso as-is.

      Importante

      Si dovrebbe utilizzare la modalità ANSI quando si reindirizza l'output a un file o a una pipeline destinata a essere eseguita a valle. In questo modo si garantisce che l'output non venga modificato. L'uso di qualsiasi altra modalità modifica l'output rimuovendo sequenze di escape ANSI, che possono modificare il comportamento di esecuzione.

    • PlainText: le sequenze di escape ANSI vengono sempre rimosse in modo che sia solo testo normale. Nelle sessioni remote, se l'host remoto è impostato su PlainText, l'output viene rimosso dalle sequenze di escape ANSI prima di inviarlo al client locale.

    • Host: si tratta del comportamento predefinito. Le sequenze di escape ANSI vengono rimosse dall'output reindirizzato o inviato tramite pipe. Per altre informazioni, vedere Reindirizzamento dell'output.

  • I membri $PSStyle.Background e $PSStyle.Foreground sono stringhe che contengono le sequenze di escape ANSI per i 16 colori della console standard.

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

    I valori sono impostabili e possono contenere un numero qualsiasi di sequenze di escape ANSI. Esiste anche un metodo FromRgb() per specificare il colore a 24 bit. Esistono due modi per chiamare il metodo FromRgb().

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

    Uno degli esempi seguenti imposta il colore di sfondo con il colore a 24 bit Beige.

    $PSStyle.Background.FromRgb(245, 245, 220)
    $PSStyle.Background.FromRgb(0xf5f5dc)
    
  • $PSStyle.Formatting è un oggetto annidato per controllare la formattazione predefinita dei messaggi di debug, errore, dettagliato, avviso, e delle intestazioni di elenco e tabella. È anche possibile controllare attributi come il grassetto e la sottolineatura. Sostituisce $Host.PrivateData come metodo per gestire i colori nella formattazione del rendering. $Host.PrivateData continua a esistere per la compatibilità con le versioni precedenti, ma non è connessa a $PSStyle.Formatting. $PSStyle.Formatting ha i membri seguenti:

    • FormatAccent : formattazione per gli elementi dell'elenco
    • ErrorAccent - Formattazione per i metadati degli errori
    • Errore - Formattazione per i messaggi di errore
    • Avviso - formattazione per i messaggi di avviso
    • Verbose - formattazione per messaggi dettagliati
    • Debug - Formattazione per i messaggi di debug
    • TableHeader - Formattazione per le intestazioni di tabella
    • CustomTableHeaderLabel: formattazione delle intestazioni di tabella che non sono effettivamente proprietà dell'oggetto
    • FeedbackName : formattazione per il nome del provider di feedback (aggiunta come funzionalità sperimentale in PowerShell 7.4)
    • FeedbackText : formattazione per i messaggi di feedback (aggiunta come funzionalità sperimentale in PowerShell 7.4)
    • FeedbackAction : formattazione per le azioni suggerite dal provider di commenti e suggerimenti (aggiunta come funzionalità sperimentale in PowerShell 7.4)
  • $PSStyle.Progress consente di controllare il rendering della barra di avanzamento.

    • Stile : stringa ANSI che imposta lo stile di rendering.
    • maxWidth : imposta la larghezza massima della visualizzazione. Il valore predefinito è 120. Il valore minimo è 18.
    • View : enumerazione con valori, Minimal e Classic. Classic è il rendering esistente senza modifiche. Minimal è un rendering minimo a riga singola. Minimal è l'impostazione predefinita.
    • UseOSCIndicator: predefinito a $false. Impostare questa opzione su $true per i terminali che supportano gli indicatori OSC.

    Nota

    Se l'host non supporta il terminale virtuale, $PSStyle.Progress.View viene impostato automaticamente su Classic.

    Nell'esempio seguente, lo stile di rendering viene impostato su una barra di avanzamento minimale.

    $PSStyle.Progress.View = 'Minimal'
    
  • è un oggetto annidato per controllare la colorazione degli oggetti FileInfo .

    • Directory - Membro integrato per specificare il colore delle directory

    • CollegamentoSimbolico - Membro predefinito per specificare il colore dei collegamenti simbolici

    • Eseguibile - Funzionalità integrata per specificare il colore per i file eseguibili.

    • Estensione: usare questo membro per definire i colori per estensioni di file diverse. Il membro Extension consente di predefinito i colori per le estensioni di file archive e PowerShell.

      Nell'esempio seguente viene illustrato come modificare i colori per varie FileInfo impostazioni ed estensioni di file specifiche. I colori vengono scelti per funzionare bene su uno sfondo terminale chiaro.

      $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
      

Cmdlet che generano l'output ANSI

  • I cmdlet markdown: il cmdlet Show-Markdown visualizza il contenuto di un file contenente testo markdown. Il rendering dell'output viene eseguito usando sequenze ANSI per rappresentare stili diversi. È possibile gestire le definizioni degli stili usando i cmdlet Get-MarkdownOption e Set-MarkdownOption.
  • Cmdlet PSReadLine: il modulo PSReadLine usa sequenze ANSI per colorare gli elementi della sintassi di PowerShell nella riga di comando. I colori possono essere gestiti usando Get-PSReadLineOption e Set-PSReadLineOption.
  • : il cmdlet Get-Error restituisce una visualizzazione dettagliata di un oggetto Error formattato per semplificare la lettura.
  • Select-String: a partire da PowerShell 7.0, Select-String usa sequenze ANSI per evidenziare i modelli corrispondenti nell'output.
  • Write-Progress: l'output ANSI viene gestito usando $PSStyle.Progress, come descritto in precedenza. Per ulteriori informazioni, vedere Write-Progress

Reindirizzamento dell'output in modalità host

Per impostazione predefinita, $PSStyle.OutputRendering è impostato su Host. Le sequenze di escape ANSI vengono rimosse dall'output reindirizzato o inviato tramite pipe.

OutputRendering si applica solo al rendering nell'Host, Out-Filee Out-String. L'output dei file eseguibili nativi non è interessato.

PowerShell 7.2.6 ha modificato il comportamento di Out-File e Out-String per gli scenari seguenti:

  • Quando l'oggetto di input è una stringa pura, questi cmdlet mantengono invariata la stringa indipendentemente dall'impostazione OutputRendering.
  • Quando all'oggetto di input deve essere applicata una visualizzazione di formattazione, questi cmdlet mantengono o rimuovono sequenze di escape dalle stringhe di output di formattazione in base all'impostazione OutputRendering.

Si tratta di una modifica di rilievo in questi cmdlet rispetto a PowerShell 7.2.

OutputRendering non si applica all'output del processo host di PowerShell, ad esempio quando si esegue pwsh da una riga di comando e si reindirizza l'output.

Nell'esempio seguente PowerShell viene eseguito in Linux da bash. Il cmdlet Get-ChildItem produce testo con decorazione ANSI. Poiché il reindirizzamento si verifica nel processo di bash, all'esterno dell'host di PowerShell, l'output non è interessato da OutputRendering.

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

Quando si esamina il contenuto di out.txt vengono visualizzate le sequenze di escape ANSI.

Al contrario, quando il reindirizzamento si verifica all'interno della sessione di PowerShell, OutputRendering influisce sull'output reindirizzato.

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

Quando si esamina il contenuto di out.txt non sono presenti sequenze di escape ANSI.

Disabilitazione dell'output ANSI

Il supporto per le sequenze di escape ANSI può essere disattivato usando le variabili di ambiente TERM o NO_COLOR.

I valori seguenti di $Env:TERM modificano il comportamento come segue:

  • dumb : imposta $Host.UI.SupportsVirtualTerminal = $false
  • xterm-mono : imposta $PSStyle.OutputRendering = PlainText
  • xterm : imposta $PSStyle.OutputRendering = PlainText

Se $Env:NO_COLOR esiste, $PSStyle.OutputRendering è impostato su PlainText. Per altre informazioni sulla variabile di ambiente NO_COLOR, vedere https://no-color.org/.

Uso da $PSStyle C#

Gli sviluppatori C# possono accedere PSStyle come singleton, come illustrato nell'esempio seguente:

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

PSStyle esiste nello spazio dei nomi System.Management.Automation.

Il motore di PowerShell include le modifiche seguenti:

  • Il sistema di formattazione di PowerShell viene aggiornato per rispettare $PSStyle.OutputRendering.
  • Il tipo StringDecorated viene aggiunto per gestire stringhe con escape ANSI.
  • La proprietà booleana string IsDecorated è stata aggiunta per restituire true quando la stringa contiene ESC o C1 CSI sequenze di caratteri.
  • La proprietà Length di una stringa restituisce la lunghezza del testo senza le sequenze di escape ANSI.
  • Il metodo StringDecorated Substring(int contentLength) restituisce una sottostringa a partire dall'indice 0 fino alla lunghezza del contenuto che non fa parte delle sequenze di escape ANSI. Questa operazione è necessaria per la formattazione della tabella per troncare le stringhe e mantenere sequenze di escape ANSI che non occupano spazio caratteri stampabile.
  • Il metodo string ToString() rimane invariato e restituisce la versione in testo non crittografato della stringa.
  • Il metodo string ToString(bool Ansi) restituisce la stringa incorporata ANSI non elaborata se il parametro Ansi è true. In caso contrario, viene restituita una versione di testo non crittografato con sequenze di escape ANSI rimosse.
  • Il metodo FormatHyperlink(string text, uri link) restituisce una stringa contenente sequenze di escape ANSI utilizzate per decorare i collegamenti ipertestuali. Alcuni host del terminale, come il Terminale Windows, supportano questo markup, che rende il testo reso cliccabile nel terminale.

Metodi statici della classe PSStyle

PowerShell 7.4 aggiunge tre nuovi metodi statici alla classe [System.Management.Automation.PSStyle].

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

Questi metodi consentono di convertire valori ConsoleColor in sequenze di escape ANSI per i colori di primo piano e di sfondo o per una combinazione di entrambi.

Negli esempi seguenti vengono mostrate le sequenze di escape ANSI generate da questi metodi.

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

Vedere anche