[Перевод] Использование PowerShell с $PSStyle
В PowerShell 7.2 появилась автоматическая переменная $PSStyle
для новой функции под названием PSAnsiRendering. В этой статье я покажу, как можно использовать ANSI-рендеринг для управления оформлением текста, например цветом и стилизацией шрифта, в PowerShell.
Уже некоторое время мы можем использовать в сеансе PowerShell escape-последовательности ANSI. Вы уже могли наблюдать это при вводе команд в командной строке. Команды, параметры, строки и операторы отображаются цветом. Эти цвета определяются как опции PSReadline.
Оглавление:
- $PSStyle
- Настройка стиля
- Визуализация форматирования
- Стили индикаторов выполнения
- Информация о файлах
- Подводя итоги
Параметры 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.