В PowerShell 7.2 появилась автоматическая переменная $PSStyle для новой функции под названием PSAnsiRendering. В этой статье я покажу, как можно использовать ANSI-рендеринг для управления оформлением текста, например цветом и стилизацией шрифта, в PowerShell.

Уже некоторое время мы можем использовать в сеансе PowerShell escape-последовательности ANSI. Вы уже могли наблюдать это при вводе команд в командной строке. Команды, параметры, строки и операторы отображаются цветом. Эти цвета определяются как опции PSReadline.


Оглавление:

  1. $PSStyle
  2. Настройка стиля
  3. Визуализация форматирования
  4. Стили индикаторов выполнения
  5. Информация о файлах
  6. Подводя итоги



Параметры PSReadline

ANSI-последовательности начинаются с escape, который представляет собой [Char]0x1b или [Char]27. В PowerShell 7 мы можем использовать `e. Последовательность ANSI следует за escape. Вся эта последовательность предшествует строке, которую вы хотите обработать. Обычно последовательность закрывается командой сброса, $([char]27)[0m.

Создание строки ANSI:

PS C:\> "$([char]27)[38;5;121mHello, world$([char]27)[0m"
Hello, world
PS C:\> 

Вы также можете использовать ANSI для выделения полужирным шрифтом или подчёркивания.


Подчёркивание с форматированием ANSI

Это не только интересно, но и может придать дополнительную значимость выводам PowerShell. Чтобы упростить использование этой функции, компания Microsoft ввела в PowerShell 7.2 новую функцию под названием PSStyle.

$PSStyle


Насколько я могу судить, для этой функции не существует командлетов. Всё, что вам нужно, заключено в новой переменной под названием $PSStyle.


Переменная PSStyle

Значения ANSI отображаются в своих цветах.

Важно

Следует отметить, что если вы запускаете PowerShell в терминале Windows Terminal, вы получите различные интерпретации в зависимости от цветовой схемы.

Используйте эти значения вместо фактической последовательности ANSI.

"`nRunning $($psstyle.Background.Blue)PowerShell$($psstyle.Reset)$($psstyle.Reset) $($psstyle.Foreground.Yellow)v{0}$($psstyle.Reset) on $($psstyle.Foreground.BrightCyan){1}$($psstyle.Reset)." -f $($psversiontable.PSVersion),(Get-CimInstance win32_operatingsystem).caption

Возможно, я немного перемудрил, и я думаю, что здесь вполне возможны сомнения в том, проще ли это, чем использовать фактические последовательности ANSI. Но это работает.


Форматированная строка PSStyle

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

$msg = "Could not find part of path: {0}{1}{2}{3}" -f $psstyle.Italic,$psstyle.Background.Cyan,"c:\work",$psstyle.Reset
Write-Warning $msg

В этом примере я комбинирую стили.


PSStyle форматированное предупреждение

Настройка стиля


Значения цветов переднего и заднего планов доступны только для чтения. Однако объект $PSStyle имеет метод, который можно использовать для установки цвета переднего или заднего плана из набора значений RGB.

"$($PSStyle.Foreground.FromRgb(0,200,100))I am the walrus$($PSStyle.Reset)"


PSStyle RGB

Вероятнее всего, я создам и присвою новое значение переменной.

$custom = $PSStyle.Foreground.FromRgb(0,200,100)
"$($custom)I am the walrus$($PSStyle.Reset)"

Но это ещё не всё, что может предложить PSStyle.

Визуализация форматирования


В PowerShell 7.2 вы заметите, что форматированные таблицы имеют небольшой собственный стиль.


Форматированная таблица со стилем

Откуда взялись эти зелёные заголовки колонок?


Форматирование PSStyle

Вы можете изменить эти значения вместо того, чтобы изменять значения в $host.privatedata, как мы делали в предыдущих версиях PowerShell. Я изменю цвет сообщения об ошибке.

$PSStyle.Formatting.Error = "`e[38;5;201m"


Форматирование ошибки PSStyle

Вы заметите, что сообщение об ошибке отображается красным цветом, который является значением в $host.privatedata. Однако, когда я смотрю на ошибку с помощью Get-Error, отформатированный результат использует мою новую настройку PSStyle.

Вот изменения в предупреждениях.


Форматирование предупреждения PSStyle

Или изменения в заголовках таблиц.

$psstyle.Formatting.TableHeader = "`e[3;38;5;195m"


Персонализированные заголовки таблиц PSStyle

Если вы хотите вернуться к таблицам с обычным текстом, вы можете изменить настройку рендеринга.

$psstyle.OutputRendering = "Plaintext"

Однако это приведёт к отключению всех настроек, связанных с ANSI. Чтобы вернуть их, установите значение «ANSI».

Имейте в виду, что любые изменения в $PSStyle не будут постоянными, если вы не добавите их в сценарий профиля PowerShell.

Кстати, если вам интересно, откуда я взял ANSI-последовательности, я использовал команду Show-ANSISequence из модуля PSScriptTools, который можно установить из галереи PowerShell.

Стили индикаторов выполнения


Одним из важных изменений в PowerShell 7.2 является способ отображения индикаторов выполнения. Новый формат больше похож на Linux и удобен для командной строки. Кроме того, он не так сильно нагружает систему, как предыдущие варианты отображения прогресса. Настройки для нового стиля отображения прогресса настраиваются здесь.


Настройки прогресса PSStyle

Теперь, когда вы выполняете команду, использующую Write-Progress, вы получите что-то вроде этого.


PSStyle ProgressBar

Приведённая выше команда также взята из модуля PSScriptTools.

Если вам нужен или предпочтителен традиционный вид, вы можете легко установить его.

$psstyle.Progress.view = "Classic"

Используйте значение «Minimal» для нового стиля. Или можете по своему усмотрению настроить цвет.

$psstyle.Progress.Style = "`e[38;5;123m"

Вот несколько глуповатых строк кода, чтобы увидеть это в действии.

1..100 | ForEach-Object -Begin {$i= 0} -process {
	$i++
	$p = ($i/100)*100
	Write-progress -Activity "Demo" -CurrentOperation "Processing $_" -Status "Square = $($_*$_)" -PercentComplete $p
	Start-Sleep -Milliseconds 100
}


Персонализация PSStyle ProgressBar

Одним из потенциальных недостатков этого нового стиля является то, что строка CurrentOperation фактически оставлена в стороне.

Информация о файлах


Самое интересное я приберёг напоследок. Вы можете использовать $PSStyle для форматирования списков директорий.


Настройки PSStyle FileInfo по умолчанию

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

Enable-ExperimentalFeature PSANSIRenderingFileInfo

Вы увидите сообщение о перезапуске PowerShell. В отличие от изменений значений в $PSStyle, это изменение сохраняется до тех пор, пока вы не отключите функцию. Но посмотрите на разницу.


Вывод ANSI-файла

Возможно, на первый взгляд трудно определить цвет файлов PS1. Нет проблем. Я могу это изменить.

$psstyle.FileInfo.Extension[".ps1"] = "`e[38;5;123m"


Персонализация ANSI FileInfo

Вы не можете изменить то, что Windows определяет как исполняемый файл, но вы можете добавить расширение файла.

$PSStyle.FileInfo.Extension.add(".xml","`e[38;5;190m")


Персонализация форматирования файлов

Определить стиль для группы расширений файлов не так уж сложно.

$ext =".gif",".bmp",".png",".jpg",".jpeg"
foreach ($e in $ext) {
	$PSStyle.FileInfo.Extension.add($e,"`e[38;5;111m")
}

Поскольку мне было так увлекательно работать с этим, я понял, что мне нужен хороший способ настройки параметров FileInfo без необходимости постоянно редактировать скрипт профиля. Я написал набор функций PowerShell: одну для экспорта настроек FileInfo в файл JSON и другую для их импорта. Вы можете найти эти функции здесь. Сохраните файл PS1 на рабочем столе и распарсите его.

После того как вы настроили параметры FileInfo, экспортируйте их в файл JSON.

Export-PSStyleFileInfo C:\work\fileinfo.json

В вашем скрипте профиля PowerShell распарсите файл PS1, а затем импортируйте настройки.

Import-PSStyleFileInfo c:\work\fileinfo.json

Подводя итоги


Мне будет очень интересно посмотреть, как я смогу включить PSStyle в свою повседневную работу и скриптинг с PowerShell. Помните, что для этого требуется PowerShell 7.2, так что, если вы ещё не обновились, это может быть хорошей причиной сделать это. А если вы найдёте отличное применение этим настройкам, я буду рад услышать об этом, пишите о своих решения в комментариях.


НЛО прилетело и оставило здесь промокоды для читателей нашего блога:

15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

20% на выделенные серверы AMD Ryzen и Intel Core HABRFIRSTDEDIC.

Комментарии (3)


  1. kaichou
    05.03.2022 00:03

    Мдя. И одним щелчком пальцев бамс - и повершелл больше не актуален.


  1. 13werwolf13
    05.03.2022 07:48
    +1

    шо, теперь к oh-my-zsh и oh-my-bash ждать нового друга oh-my-powerhell?

    UPD: очепяточка по фрейду, даже поправлять не буду, так даже больше нравится.


    1. The_Kf
      07.03.2022 09:51

      oh-my-posh есть давно: ohmyposh.dev