[Перевод] Использование PowerShell с $PSStyle

9fcypl3rya1pinhcrbpawmsvfc4.png


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

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

Оглавление:

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


iyobuf0bhhnwbsqnz3ylylzazqa.png
Параметры 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 для выделения полужирным шрифтом или подчёркивания.

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

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

$PSStyle


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

4wyqqemjrj1lqa7lstdydbnck0q.png
Переменная 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. Но это работает.

jmmdpzf0wqvq52foqj9yoyhbine.png
Форматированная строка 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


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

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

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


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

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


ktv9ctstzvpo3e1x0e-kik8oldu.png
PSStyle RGB

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

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


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

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


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

ymgb1ixbzsmqthwtbuotkxyqz-8.png
Форматированная таблица со стилем

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

pjcw00v4o81u_se4bmdxw7pl1wg.png
Форматирование PSStyle

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

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


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

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

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

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

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

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


6lkzk-xb2i0rrnmuqapvdo2mymu.png
Персонализированные заголовки таблиц PSStyle

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

$psstyle.OutputRendering = "Plaintext"


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

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

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

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


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

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

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

2zqnyu1dx-oxvrz-yahanzu3byq.png
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
}


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

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

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


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

rg0dbvfkw7_aap-2e5q0fhmyvna.png
Настройки PSStyle FileInfo по умолчанию

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

Enable-ExperimentalFeature PSANSIRenderingFileInfo


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

dsewvw686tw3aapvz6lzn3eckxm.png
Вывод ANSI-файла

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

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


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

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

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


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

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

$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.

© Habrahabr.ru