Поделиться через


о терминалах ANSI

Краткое описание

Описывает поддержку escape-последовательностей ANSI в PowerShell.

Длинное описание

PowerShell имеет множество функций, поддерживающих использование escape-последовательностей ANSI для управления отрисовкой выходных данных в приложении терминала, в котором размещена PowerShell.

PowerShell 7.2 добавил новую автоматическую переменную $PSStyleи внес изменения в механизм PowerShell для поддержки вывода текста, украшенного ANSI.

Поддержка терминала ANSI

Функции ANSI предназначены для обеспечения совместимости с терминалами на основе xterm. Дополнительные сведения см. в разделе xterm в Википедии.

В Windows 10 и более поздних версиях хост консоли Windows совместим с xterm. Приложение терминала Windows также совместимо с xterm.

В macOS приложение терминала по умолчанию совместимо с xterm.

Для Linux каждый дистрибутив поставляется с другим приложением терминала. Ознакомьтесь с документацией по распространению, чтобы найти подходящее приложение терминала.

$PSStyle

Переменная имеет следующие свойства:

  • сброс — отключает все элементы оформления
  • Мерцание — включает мерцание
  • BlinkOff — отключает мигание
  • полужирный — включение полужирного шрифта
  • BoldOff — отключает полужирный шрифт
  • Dim — включает Dim (добавлено в PowerShell 7.4)
  • DimOff — отключает Dim (добавлено в PowerShell 7.4)
  • Скрытый — Включение 'Скрытого'
  • HiddenOff — отключает скрытость
  • обратный — включает функцию 'Обратный'
  • Отключить Reverse — выключает функцию Reverse
  • Курсив — переключает режим курсива
  • ItalicOff — отключает курсив
  • Подчеркивание — включение подчеркивания
  • ОтключитьПодчеркивание — отключает подчеркивание
  • Strikethrough — включается удар
  • StrikethroughOff - Отключает зачёркивание
  • OutputRendering — управление использованием визуализации выходных данных
  • Форматирование — объект вложенной структуры, контролирующий форматирование по умолчанию для выходных потоков
  • Progress — вложенный объект, управляющий отрисовкой индикаторов прогресса
  • FileInfo — вложенный объект для управления цветом объектов FileInfo.
  • передний план — вложенный объект для управления окраской переднего плана
  • Фоновый — вложенный объект для управления цветом фона

Базовые члены возвращают строки escape-последовательностей ANSI, которые соответствуют их именам. Значения задаются для настройки. Например, можно изменить полужирный шрифт на подчёркнутый шрифт. Имена свойств упрощают создание форматированных строк с помощью функции автозаполнения с помощью клавиши Tab.

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

Следующие члены управляют тем, как используется форматирование ANSI.

  • $PSStyle.OutputRendering — это перечисление System.Management.Automation.OutputRendering со значениями:

    • ANSI: escape-последовательности ANSI всегда передаются через as-is.

      Важный

      При перенаправлении выходных данных в файл или конвейер, предназначенный для выполнения на следующем этапе, следует использовать режим ANSI . Это гарантирует, что выходные данные не изменяются. При использовании любого другого режима выходные данные изменяются путем удаления escape-последовательностей ANSI, которые могут изменить поведение выполнения.

    • PlainText: escape-последовательности ANSI всегда удаляются, оставляя только обычный текст. В удаленных сеансах, если для удаленного узла задано значение PlainText, выходные данные будут удалены из escape-последовательностей ANSI перед отправкой обратно в локальный клиент.

    • Host: это поведение по умолчанию. Escape-последовательности ANSI удаляются из перенаправленного или передаваемого через каналы вывода. Дополнительные сведения см. в разделе Перенаправление выходных данных.

  • Элементы $PSStyle.Background и $PSStyle.Foreground — это строки, которые содержат последовательности ANSI escape для 16 стандартных цветов консоли.

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

    Значения задаются и могут содержать любое количество escape-последовательностей ANSI. Существует также метод FromRgb() для указания 24-разрядного цвета. Существует два способа вызова метода FromRgb().

    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 — форматирование метаданных об ошибке
    • Ошибка — форматирование сообщений об ошибках
    • Предупреждение, форматирование предупреждений
    • подробный — форматирование подробных сообщений
    • Отладка — форматирование отладочных сообщений
    • TableHeader — форматирование заголовков таблиц
    • CustomTableHeaderLabel — форматирование заголовков таблиц, которые не являются фактически свойствами объекта
    • FeedbackName — форматирование имени поставщика отзывов (добавлено в качестве экспериментальной функции в PowerShell 7.4)
    • FeedbackText — форматирование сообщений отзывов (добавлено в качестве экспериментальной функции в PowerShell 7.4)
    • FeedbackAction — форматирование предлагаемых поставщиком отзывов действий (добавлено в качестве экспериментальной функции в PowerShell 7.4)
  • $PSStyle.Progress позволяет контролировать отрисовку панели прогресса.

    • стиль — строка ANSI, задающая стиль отрисовки.
    • MaxWidth — задает максимальную ширину представления. По умолчанию используется 120. Минимальное значение равно 18.
    • View — перечисление со значениями Minimal и Classic. Classic — это существующая отрисовка без изменений. Minimal — это минимальная однолинейная отрисовка. Minimal — это значение по умолчанию.
    • UseOSCIndicator — по умолчанию $false. Задайте для этого значение $true для терминалов, поддерживающих индикаторы OSC.

    Заметка

    Если узел не поддерживает виртуальный терминал, $PSStyle.Progress.View автоматически устанавливается на Classic.

    В следующем примере стиль отрисовки устанавливается на минимальный индикатор выполнения.

    $PSStyle.Progress.View = 'Minimal'
    
  • $PSStyle.FileInfo — это вложенный объект для управления цветом объектов FileInfo.

    • Каталог — встроенный элемент, указывающий цвет каталогов

    • Символьная связь — встроенный компонент для указания цвета символьных ссылок

    • Исполняемый файл — встроенный член для указания цвета исполняемого файла.

    • Extension. Используйте этот элемент для определения цветов для разных расширений файлов. Член расширения предопределяет цвета для расширений архивов и файлов PowerShell.

      В следующем примере показано, как изменить цвета для различных FileInfo параметров и определенных расширений файлов. Цвета выбираются для хорошой работы на светлом фоне терминала.

      $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

  • Командлеты Markdown — командлет Show-Markdown отображает содержимое файла, содержащего текст 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

Перенаправление выходных данных в режиме узла

По умолчанию $PSStyle.OutputRendering — это хост. Escape-последовательности ANSI удаляются из перенаправленного или передаваемого через каналы вывода.

OutputRendering применяется только к отрисовке в Host, Out-Fileи Out-String. Выходные данные из собственных исполняемых файлов не затрагиваются.

PowerShell 7.2.6 изменил поведение Out-File и Out-String для следующих сценариев:

  • Если входной объект является чистой строкой, эти командлеты сохраняют строку без изменений независимо от параметра OutputRendering.
  • Если к объекту ввода необходимо применить представление форматирования, эти командлеты сохраняют или удаляют escape-последовательности из выходных строк форматирования на основе параметра OutputRendering.

Это критическое изменение в этих командлетах по сравнению с PowerShell 7.2.

OutputRendering не применяется к выходным данным из процесса узла PowerShell, например при запуске pwsh из командной строки и перенаправлении выходных данных.

В следующем примере PowerShell запускается в Linux из bash. Командлет Get-ChildItem создает украшенный ANSI текст. Так как перенаправление происходит в процессе bash за пределами узла PowerShell, выходные данные не влияют на OutputRendering.

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

При проверке содержимого out.txt отображаются escape-последовательности ANSI.

Напротив, при перенаправлении в сеансе PowerShell OutputRendering влияет на перенаправленные выходные данные.

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

При проверке содержимого out.txt нет escape-последовательностей ANSI.

Отключение выходных данных ANSI

Поддержку Escape-последовательностей ANSI можно отключить с помощью переменных среды TERM или NO_COLOR.

Следующие значения параметра $Env:TERM изменяют поведение следующим образом:

  • dumb — задает $Host.UI.SupportsVirtualTerminal = $false
  • xterm-mono — задает $PSStyle.OutputRendering = PlainText
  • xterm — задает $PSStyle.OutputRendering = PlainText

Если $Env:NO_COLOR существует, то $PSStyle.OutputRendering устанавливается в PlainText. Дополнительные сведения о переменной среды NO_COLOR см. в https://no-color.org/.

Использование $PSStyle из C#

Разработчики C# могут получить доступ к PSStyle как паттерн синглтон, как показано в следующем примере:

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

PSStyle существует в пространстве имен System.Management.Automation.

Подсистема PowerShell включает следующие изменения:

  • Система форматирования PowerShell обновляется с учётом $PSStyle.OutputRendering.
  • Тип StringDecorated добавляется для обработки экранированных строк ANSI.
  • Логическое свойство string IsDecorated было добавлено для возврата true, если строка содержит ESC или C1 CSI последовательности символов.
  • Свойство Length строки возвращает длину текста без escape-последовательностей ANSI.
  • Метод StringDecorated Substring(int contentLength) возвращает подстроку, начиная с индекса 0 до длины содержимого, которая не является частью escape-последовательностей ANSI. Это необходимо для форматирования таблицы, чтобы обрезать строки и сохранить управляющие последовательности ANSI, не занимающие место для печатных символов.
  • Метод string ToString() остается неизменным и возвращает версию строки с открытым текстом.
  • Метод string ToString(bool Ansi) возвращает необработанную строку ANSI, внедренную, если параметр Ansi принимает значение true. В противном случае возвращается версия текста без оформления, из которой удалены escape-последовательности ANSI.
  • Метод FormatHyperlink(string text, uri link) возвращает строку, содержащую управляющие последовательности ANSI, используемые для оформления гиперссылок. Некоторые узлы терминала, такие как Windows Terminal, поддерживают эту разметку, что позволяет делать отрисованный текст кликабельным в терминале.

Статические методы класса PSStyle

PowerShell 7.4 добавляет три новых статических метода в класс [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)

Эти методы позволяют преобразовать значения ConsoleColor в escape-последовательности ANSI для переднего плана и фоновых цветов или для сочетания обоих.

В следующих примерах показаны escape-последовательности 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

См. также