Power-моддинг
Настраиваем PowerShell, чтобы получать удовольствие от работы
Представь себе, насколько приятно пользоваться терминалом и оболочкой, которые отображают полезную информацию (например, состояние репозитория Git), подсказывают нужные команды и проверяют их корректность, позволяют выполнять постоянно повторяемые действия несколькими нажатиями клавиш.
В сети можно найти много информации о приемах работы в командных оболочках операционных систем macOS и Linux и об инструментах для их настройки. Например, для популярной современной оболочки Zsh разработан специальный фреймворк Oh My Zsh, который упрощает управление конфигурациями, темами и плагинами для расширения функциональности консоли.
О стандартной для Windows оболочке PowerShell (которая, кстати, кросс‑платформенная, ей можно пользоваться во всех операционных системах) говорят и пишут реже. Чтобы устранить этот пробел, я посвятил ее особенностям, использованию и возможностям целую книгу «Современный PowerShell», второе издание которой вышло буквально месяц назад. Многие просто не знают о стандартной функциональности PowerShell и считают, что этот командный интерпретатор значительно уступает тому же Zsh по удобству работы и возможностям кастомизации. В этой статье я постараюсь показать, что это не так, и расскажу, какие встроенные возможности и дополнительные модули (в том числе Oh My Posh) помогут тебе сделать свою работу в консоли PowerShell более производительной, удобной и приятной.
Проверка команд
Оболочка PowerShell анализирует команду по мере ее набора, не дожидаясь завершения ввода. При этом названия команд, параметров и переменных, а также ключевые конструкции и другие элементы языка отображаются разным цветом. Это помогает лучше понять структуру команд и снижает вероятность ошибки при наборе.

Если при наборе команды получается синтаксически неверная конструкция (например, мы забыли поставить закрывающую скобку или не написали команду после знака конвейера), то последний знак >
в приглашении командной строки окрасится в красный цвет.

Автоматическое завершение команд
Работая в терминале, совсем не обязательно полностью набирать длинные команды с несколькими параметрами. PowerShell поддерживает автоматическое завершение разных частей своих команд:
- пути к файлам и каталогам в файловой системе. В записи путей файловой системы можно использовать шаблонные символы:
?
(заменяет один произвольный символ) и*
(заменяет любое количество произвольных символов); - имена самих команд PowerShell и их параметров;
- имена переменных, определенных в оболочке;
- имена свойств и методов объектов.
Возможностью автоматического завершения команд можно пользоваться в двух режимах — подстановка единичного значения или выбор из всех возможных вариантов.
Нажимая клавишу Tab, мы будем циклически перебирать все возможные варианты по одному. Например, введем в командной строке PowerShell первую часть имени командлета, глагол get
:
PS C:\Users\andrv> get-
Нажмем клавишу Tab, в командной строке первый подходящий командлет:
PS C:\Users\andrv> Get-Acl
Еще раз нажав Tab, получим следующий по алфавиту командлет:
PS C:\Users\andrv> Get-Alias
Нажимая далее клавишу Tab, мы можем перебрать все командлеты, начинающиеся с глагола Get
.
Посмотрим, как PowerShell может помочь при наборе свойств и методов объектов. Введем следующие команды:
PS C:\Users\andrv> $s='qwerty'
PS C:\Users\andrv> $s.len
Нажмем клавишу Tab:
PS C:\Users\andrv> $s.Length
Оболочка автоматически подставила свойство Length
, имеющееся у символьных переменных. Если подставляется имя метода (функции), а не свойства, то после его имени автоматически ставится круглая скобка. Например, введем следующую команду:
PS C:\Users\andrv> $s.sub
Нажмем клавишу Tab:
PS C:\Users\andrv> $s.Substring(
Теперь можно вводить параметры метода Substring
.
Для завершения ввода команды удобнее не перебирать варианты по одному, а посмотреть на их полный список и выбрать в нем нужный пункт. Такое меню с вариантами автодополнения открывается по нажатию комбинации клавиш Ctrl-пробел. По предложенным вариантам можно переходить с помощью клавиш со стрелками либо нажимая начальные буквы команд. Для вставки в командную строку выбранного варианта нужно нажать Enter.
Например, если после имени команды через пробел набрать знак тире и нажать Ctrl-пробел, то ты увидишь список всех параметров, поддерживаемых этой командой. Для текущего выбранного свойства на экране отображается его тип.

Чтобы быстро посмотреть все имеющиеся у объекта свойства и методы, нужно ввести его имя, точку и нажать Ctrl-пробел. Для свойств будет указан их тип, а для методов — список аргументов и тип возвращаемого значения.

Повтор команд из истории
Для циклического просмотра истории выполнявшихся команд используются клавиши управления курсором ↑ (предыдущая команда) и ↓ (следующая команда). Выбранную команду из истории можно сразу выполнить или изменить нужным образом.
Если ты помнишь только часть команды (необязательно с начала), то по ней можно найти подходящие варианты среди тех команд, которые выполнялись в оболочке раньше. Строка для поиска в таком режиме активируется нажатием комбинации клавиш Ctrl-r (поиск по истории команд назад) или Ctrl-s (поиск по истории команд вперед). При этом поиск будет инкрементальным, то есть результат уточняется после ввода каждой новой буквы.

Также, кроме автоматического завершения частей команд, PowerShell поддерживает технологию автодополнения IntelliSense, когда оболочка сразу выдает подходящий завершенный вариант из списка вводившихся ранее команд. Принять предложенный вариант можно одним нажатием клавиши «вправо».
По умолчанию режим IntelliSense в PowerShell отключен, активировать его в текущей сессии можно следующей командой:
Set-PSReadLineOption -PredictionSource 'History'

Ввод команды в несколько строк
По умолчанию нажатие клавиши Enter при наборе команды завершает ее ввод, после чего оболочка определяет, чем является введенная строка:
- синтаксически верной завершенной командой или выражением PowerShell. В этом случае команда выполняется (выражение вычисляется) и оболочка переходит к приему следующей команды;
- корректной незавершенной командой или выражением PowerShell, которые могут быть продолжены после пробела. В таком случае ввод команды продолжается на следующей строке (символ перевода строки при этом рассматривается как обычный разделяющий пробел).
Например, вычислим значение выражения 10+2-3+(5*4-3), расположив его на трех строках:
PS C:\Users\andrv> 10+
〉〉 2-3+(
〉〉 5*4-3)
26
Как видим, приглашение при вводе дополнительных строк меняется на символы 〉〉
— это признак того, что продолжается ввод предыдущей команды.
Таким образом, многословные команды можно располагать на нескольких строках. При этом можно свободно перемещаться по строкам команды, изменять их, добавлять новые строки выше и ниже текущей строки. Новая строка после текущей вставляется по нажатию комбинации Shift-Enter, а перед текущей строкой — по нажатию Ctrl-Enter.
Но как быть, если ты набрал синтаксически верную команду с несколькими параметрами и ее нужно продолжить на новой строке, а не выполнить? В этом случае последним символом в строке нужно ввести обратный апостроф и нажать Enter. После этого ввод команды продолжится со следующей строки.
PS C:\Users\andrv> Get-Process `
>> -Name powershell
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
688 45 58568 77196 3,59 14916 3 powershell
Настраиваем комбинации клавиш при работе в командной строке: Модуль PSReadLine
Если некоторые из описанных выше возможностей на твоем компьютере не работают, то это может быть связано с отсутствием в оболочке подключенного модуля PSReadLine. В Windows PowerShell 5.1 для Windows 10/11 и в кросс‑платформенных версиях PowerShell этот модуль должен быть установлен по умолчанию. Увидеть список подключенных модулей и проверить наличие в нем PSReadLine можно с помощью команды Get-Module:
PS C:\Users\andrv> Get-Module | Select Name, Version
Name Version
---- -------
Microsoft.PowerShell.Management 3.1.0.0
Microsoft.PowerShell.Security 3.0.0.0
Microsoft.PowerShell.Utility 3.1.0.0
Microsoft.WSMan.Management 3.0.0.0
PSReadline 2.1.0
Подробную информацию о модуле PSReadLine можно посмотреть следующим образом:
PS C:\Users\andrv> Get-Module PSReadline | Format-List
Name : PSReadline
Path : C:\Program Files\WindowsPowerShell\Modules\
PSReadline\2.1.0\PSReadLine.psm1
Description : Great command line editing in the PowerShell
console host
ModuleType : Script
Version : 2.1.0
NestedModules : {Microsoft.PowerShell.PSReadLine2}
ExportedFunctions : PSConsoleHostReadLine
ExportedCmdlets : {Get-PSReadLineKeyHandler, Get-PSReadLineOp
tion, Remove-PSReadLineKeyHandler, Set-PSRe
adLineKeyHandler...}
ExportedVariables :
ExportedAliases :
Если модуль PSReadLine не обнаружен, то его нужно установить с помощью следующей команды:
Install-Module PSReadLine -Force -Scope CurrentUser -SkipPublisherCheck
В PSReadLine определены сочетания клавиш для выполнения различных действий, в том числе для редактирования текста в командной строке. Например:
Клавиатурная комбинация | Действие |
---|---|
Ctrl-влево | Перемещение курсора влево на одно слово |
Ctrl-вправо | Перемещение курсора вправо на одно слово |
Home | Перемещение курсора в начало текущей строки |
End | Перемещение курсора в конец текущей строки |
Ctrl-Home | Удаление символов от текущей позиции курсора до начала строки |
Ctrl-End | Удаление символов от текущей позиции курсора до конца строки |
Esc | Очистка строки (удаление всех введенных символов) |
Ctrl-z | Отмена изменений |
Ctrl-y | Повтор изменений |
Посмотреть все поддерживаемые клавиатурные комбинации и операции можно с помощью команды Get-PSReadlineKeyHandler
:
PS C:\Users\andrv> Get-PSReadlineKeyHandler
Basic editing functions
=============================
Key Function Description
--- -------- -----------
Enter AcceptLine Accept the input or move to the
next line if input is missing
a closing token.
Shift+Enter AddLine Move the cursor to the next line
without attempting to execute
the input
Backspace BackwardDeleteChar Delete the character before the
cursor
Ctrl+h BackwardDeleteChar Delete the character before the
cursor
Ctrl+Home BackwardDeleteLine Delete text from the cursor to
the start of the line
Ctrl+Backspace BackwardKillWord Move the text from the start of
the current or previous word to
the cursor to the kill ring
Ctrl+w BackwardKillWord Move the text from the start of
the current or previous word to
the cursor to the kill ring
Ctrl+C Copy Copy selected region to the sys
tem clipboard. If no region is
selected, copy the whole line
...
Каждая операция, поддерживаемая PSReadLine, здесь отнесена к одной из категорий:
- Basic editing functions — основные функции редактирования;
- Cursor movement functions — функции для перемещения курсора;
- History functions — функции для работы с историей команд;
- Completion functions — функции автодополнения при вводе;
- Miscellaneous functions — различные функции;
- Selection functions — функции для выделения текста;
- Search functions — функции для поиска символов в строке ввода.
Изменить сочетания клавиш позволяет команда Set-PSReadlineKeyHandler
. Например, назначим клавишам «вверх» и «вниз» функции HistorySearchBackward
(поиск назад по истории команд) и HistorySearchForward
(поиск вперед по истории команд) соответственно:
PS C:\Users\andrv> Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
PS C:\Users\andrv> Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
Теперь мы сможем подставлять в командную строку команды из истории, набрав в командной строке их начальные символы и нажимая клавишу ↑ или клавишу ↓.
Чтобы не набирать при каждом запуске PowerShell команды для настройки PSReadLine, их нужно поместить в свой PowerShell-профиль (скрипт, который автоматически выполняется при запуске PowerShell), путь к которому хранится в переменной $PROFILE
. В этом случае команды из профиля будут запускаться при каждом входе в оболочку. Открыть профиль для редактирования в блокноте можно так:
notepad %PROFILE
Отмечу также, что по умолчанию PSReadLine
сохраняет в текстовом файле на диске все команды, которые выполнялись в оболочке PowerShell. Посмотреть на содержимое этого файла в блокноте можно следующей командой:
notepad (Get-PSReadLineOption).HistorySavePath
Интеграция с Git: модуль posh-git
Система управления версиями Git — современный стандарт для хранения кода и обмена им, ею пользуются практически все разработчики.
Для интеграции Git и PowerShell служит модуль posh-git. После установки этого модуля в приглашении командной строки будет отображаться информация о состоянии текущего Git-репозитория, а команды и параметры Git можно будет автоматически дополнять при вводе по нажатию клавиши Tab.
Перед тем как устанавливать posh-git, убедись, что система Git установлена и доступна в оболочке PowerShell. Для этого в консоли PowerShell нужно выполнить команду git
, которая должна вывести информацию о версии Git:
PS C:\Users\andrv> git --version
git version 2.28.0.windows.1
Устанавливается posh-git стандартным образом с помощью командлета Install-Module
:
PS C:\Users\andrv> Install-Module posh-git -Scope CurrentUser -Force
После установки нужно импортировать из posh-git все команды:
PS C:\Users\andrv> Import-Module posh-git
Команду для импорта надо поместить в свой профиль (сценарий, путь к которому хранится в переменной $PROFILE
) для автоматического выполнения при каждом запуске оболочки. Для этого можно открыть сценарий профиля в блокноте (команда notepad
) и добавить туда нужную команду или просто выполнить команду Add-PoshGitToProfile
из модуля posh-git.
Чтобы увидеть изменения в командной строке, надо войти в каталог, являющийся Git-репозиторием. Создадим новый каталог git-test
, а в нем — новый репозиторий Git:
PS C:\Users\andrv> mkdir git-test
Каталог: C:\Users\andrv
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 03.10.2021 10:04 git-test
PS C:\Users\andrv> cd git-test
PS C:\Users\andrv\git-test> git init
PS C:\Users\andrv\git-test [master]>
В приглашении командной строки после пути к текущему каталогу в квадратных скобках теперь выводится информация о состоянии Git-репозитория. Пока мы видим только имя master
текущей ветки, так как файлов в рабочем каталоге нет:
PS C:\Users\andrv\git-test [master]> git statusOn branch masterNo commits yetnothing to commit (create/copy files and use "git add" to track)
Создадим три новых файла:
PS C:\Users\andrv\git-test [master]> New-Item file1.txt, file2.txt, file3.txt -ItemType File
Каталог: C:\Users\andrv\git-test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 03.10.2021 10:28 0 file1.txt
-a---- 03.10.2021 10:28 0 file2.txt
-a---- 03.10.2021 10:28 0 file3.txt
PS C:\Users\andrv\git-test [master +3 ~0 -0 !]>
В подсказке о состоянии репозитория появились новые данные: восклицательный знак указывает на то, что в рабочем каталоге есть файлы, которые не добавлены в индекс Git, а число после знака +
показывает количество таких файлов.
Добавим файл file1.
в индекс Git:
PS C:\Users\andrv\git-test [master +3 ~0 -0 !]> git add file1.txt
PS C:\Users\andrv\git-test [master +1 ~0 -0 | +2 ~0 -0 !]>
Теперь в подсказке указана информация о файлах в индексе Git (слева от разделителя |
) и о файлах в рабочем каталоге (справа от разделителя |
). В нашем случае в индексе находится один новый файл (число после знака +
), а в рабочем каталоге остались два новых файла.
Изменим файл file1.
, добавив в него строку:
PS C:\Users\andrv\git-test [master +1 ~0 -0 | +2 ~0 -0 !]> "Hello!" >> file1.txt
PS C:\Users\andrv\git-test [master +1 ~0 -0 | +2 ~1 -0 !]>
Как видим, в секции рабочего каталога после знака ~
теперь указана единица — это количество измененных файлов в рабочем каталоге.
Добавим в индекс Git файл file2.
:
PS C:\Users\andrv\git-test [master +1 ~0 -0 | +2 ~1 -0 !]> git add file2.txt
PS C:\Users\andrv\git-test [master +2 ~0 -0 | +1 ~1 -0 !]>
Теперь в индексе два новых файла (+2
), в рабочем каталоге один новый файл (+1
) и один измененный файл (~1
).
Удалим файл file2.
из рабочего каталога:
PS C:\Users\andrv\git-test [master +2 ~0 -0 | +1 ~1 -0 !]> Remove-Item file2.txt
PS C:\Users\andrv\git-test [master +2 ~0 -0 | +1 ~1 -1 !]>
Информация о файлах в индексе не изменилась (+2
), а в рабочем каталоге теперь один новый файл (+1
), один измененный файл (~1
) и один удаленный файл (-1
).
Создадим коммит (зафиксируем изменения в репозитории), в который войдут файлы file1.
и file2.
из индекса:
PS C:\Users\andrv\git-test [master +2 ~0 -0 | +1 ~1 -1 !]> git commit -m "First commit"
[master (root-commit) b22296c] First commit
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 file1.txt
create mode 100644 file2.txt
PS C:\Users\andrv\git-test [master +1 ~1 -1 !]>
После коммита индекс Git очистился и в подсказке о состоянии репозитория осталась только информация о файлах в рабочем каталоге.
Добавим в индекс все файлы из рабочего каталога:
PS C:\Users\andrv\git-test [master +1 ~1 -1 !]> git add .
PS C:\Users\andrv\git-test [master +1 ~1 -1 ~]>
Индикатор состояния репозитория изменился со знака !
на знак ~
, означающий, что в репозитории есть незакоммиченные изменения:
PS C:\Users\andrv\git-test [master +1 ~1 -1 ~]> git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: file1.txt
deleted: file2.txt
new file: file3.txt
PS C:\Users\andrv\git-test [master +1 ~1 -1 ~]>
Таким образом, подсказка в приглашении командной строки помогает быстро понять, в каком состоянии находится Git-репозиторий. Для более наглядного представления этой информации можно изменить тему оформления консоли с помощью модуля Oh My Posh.
Оформляем приглашение командной строки: модуль Oh My Posh
Декорировать консоль PowerShell можно с помощью настраиваемых тем оформления, которые предлагает модуль Oh My Posh. С третьей версии этот модуль стал кросс‑платформенным, и его можно применять как в Windows, так и в macOS и Linux.
В темах Oh My Posh используются различные значки, которые отображаются с помощью шрифтов Powerline с глифами. Поэтому такие шрифты нужно предварительно установить в операционную систему и подключить их в терминале.
Установка шрифтов Powerline
В темах Oh My Posh рекомендуется использовать шрифты NerdFonts, которые можно скачать, например, с сайта GitHub:
PS C:\Users\andrv> Invoke-WebRequest -Uri 'https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/CascadiaCode.zip' -OutFile .\nf_fonts.zip
С помощью команды Expand-Archive
распакуем загруженный архив в каталог NerdFonts:
PS C:\Users\andrv> Expand-Archive .\nf_fonts.zip -DestinationPath .\NerdFonts
Для установки шрифтов в систему откроем в проводнике Windows папку NerdFonts
с загруженными шрифтами, выделим в ней все TTF-файлы, щелкнем на выделении правой кнопкой мыши и в контекстном меню выберем пункт «Установить для всех пользователей». После этого загруженный архив и каталог с его содержимым можно удалить:
PS C:\Users\andrv> Remove-Item .\nf_fonts.zip
PS C:\Users\andrv> Remove-Item .\NerdFonts -Recurse
После установки загруженных шрифтов нужно назначить шрифт CaskaydiaCove
в качестве шрифта для профиля Windows PowerShell в терминале Windows. Это можно сделать на вкладке Appearance в настройках профиля Windows PowerShell.

Установка модуля Oh My Posh
Модуль Oh My Posh устанавливается стандартно:
PS C:\Users\andrv> Install-Module oh-my-posh -Scope CurrentUser -Force
Модуль довольно объемный, установка его может занять продолжительное время.
После установки с помощью команды Get-PoshThemes
можно посмотреть все стандартные встроенные темы оформления, которые поддерживает Oh My Posh.

Установить понравившуюся тему можно с помощью команды Set-PoshPrompt
, указав название темы в качестве значения параметра -Theme
. Например, выберем тему agnoster
и перейдем в каталог git-test
, являющийся репозиторием Git.

Теперь в приглашении командной строки отображаются имена пользователя и компьютера, путь к текущему каталогу от домашнего каталога и имя текущей ветки в Git-репозитории.
Для автоматического применения выбранной схемы при загрузке PowerShell нужно добавить команду Set-PoshPrompt
в профиль PowerShell (напомню, что путь к профилю хранится в переменной $PROFILE
).
По умолчанию в теме agnoster
отключен вывод подробной информации о состоянии Git-репозитория, которую предоставляет модуль posh-git
. Чтобы включить эту информацию, в конфигурационный JSON-файл с настройками темы нужно внести изменения, описанные в документации модуля Oh My Posh.
Путь к каталогу с темами можно посмотреть в конце вывода команды Get-PoshThemes
.

Выполнив команду dir
для этого каталога, мы по названию схемы узнаем имя соответствующего конфигурационного файла (для нашей схемы agnoster
это файл agnoster.
). Его нужно открыть в текстовом редакторе и добавить в раздел, связанный с Git, параметр "properties"
:
{ "display_status": true }:{ "type": "git", "style": "powerline", "powerline_symbol": "\uE0B0", "foreground": "#193549", "background": "#95ffa4", "properties": { "display_status": true }}
После сохранения конфигурационного файла и перезапуска оболочки мы в приглашении командной строки увидим информацию о статусе файлов в рабочем каталоге и индексе Git.

Оформляем списки файлов и каталогов: модуль Terminal-Icons
Работая в командной строке, мы часто с помощью команды Get-ChildItem
(псевдонимы dir
и ls
) просматриваем списки файлов и каталогов. Модуль Terminal-Icons делает эти списки более наглядными, выделяя различные типы файлов разным цветом и добавляя к названиям файлов соответствующие значки.
Установим и импортируем модуль Terminal-Icons:
PS C:\Users\andrv> Install-Module Terminal-Icons -Scope CurrentUser -Force
PS C:\Users\andrv> Import-Module Terminal-Icons
Теперь список файлов и каталогов выглядит намного интереснее.

Если тебе понравился такой формат отображения файлов и каталогов, то команду импортирования модуля Terminal-Icons следует добавить в профиль PowerShell (напомню, что путь к профилю хранится в переменной $PROFILE
).
Выводы
Мы рассмотрели различные способы настройки PowerShell для повышения продуктивности и комфорта работы. Использование модуля PSReadLine позволяет не только ускорить работу с командами, но и добавить интеллектуальные функции автодополнения, что особенно важно при написании сложных и длинных команд. Интеграция с системами контроля версий через posh-git обеспечивает наглядное представление текущего состояния Git-репозиториев прямо в командной строке, что удобно как для разработчиков, так и для системных администраторов.
Настройка визуальной составляющей с использованием Oh My Posh и Terminal-Icons не только улучшает внешний вид терминала, но и помогает мгновенно ориентироваться в файловой системе, добавляя цветовые метки к объектам.
Каждый из предложенных инструментов можно адаптировать под свой стиль работы, делая взаимодействие с системой и эффективным, и эстетически приятным.