Ра­бота в коман­дной стро­ке дол­жна при­носить удо­воль­ствие, а не мучение от вво­да длин­ных команд со мно­жес­твом парамет­ров, в которых лег­ко оши­бить­ся. В этой статье мы раз­берем­ся, как нас­тро­ить обо­лоч­ку PowerShell, что­бы сде­лать ее мак­сималь­но ком­фор­тной.

Пред­ставь себе, нас­коль­ко при­ятно поль­зовать­ся тер­миналом и обо­лоч­кой, которые отоб­ража­ют полез­ную информа­цию (нап­ример, сос­тояние репози­тория Git), под­ска­зыва­ют нуж­ные коман­ды и про­веря­ют их кор­рек­тность, поз­воля­ют выпол­нять пос­тоян­но пов­торя­емые дей­ствия нес­коль­кими нажати­ями кла­виш.

В сети мож­но най­ти мно­го информа­ции о при­емах работы в коман­дных обо­лоч­ках опе­раци­онных сис­тем macOS и Linux и об инс­тру­мен­тах для их нас­трой­ки. Нап­ример, для популяр­ной сов­ремен­ной обо­лоч­ки Zsh раз­работан спе­циаль­ный фрей­мворк Oh My Zsh, который упро­щает управле­ние кон­фигура­циями, темами и пла­гина­ми для рас­ширения фун­кци­ональ­нос­ти кон­соли.

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

Проверка команд

Обо­лоч­ка 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-про­бел, то ты уви­дишь спи­сок всех парамет­ров, под­держи­ваемых этой коман­дой. Для текуще­го выб­ранно­го свой­ства на экра­не отоб­ража­ется его тип.

Список всех параметров команды Get-Process
Спи­сок всех парамет­ров коман­ды Get-Process

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

Список всех свойств и методов объекта типа System.String
Спи­сок всех свой­ств и методов объ­екта типа System.String

Повтор команд из истории

Для цик­личес­кого прос­мотра исто­рии выпол­нявших­ся команд исполь­зуют­ся кла­виши управле­ния кур­сором ↑ (пре­дыду­щая коман­да) и ↓ (сле­дующая коман­да). Выб­ранную коман­ду из исто­рии мож­но сра­зу выпол­нить или изме­нить нуж­ным обра­зом.

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

Инкрементальный поиск выполнявшихся ранее команд, содержащих строку ali
Ин­кре­мен­таль­ный поиск выпол­нявших­ся ранее команд, содер­жащих стро­ку ali

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

По умол­чанию режим IntelliSense в PowerShell отклю­чен, акти­виро­вать его в текущей сес­сии мож­но сле­дующей коман­дой:

Set-PSReadLineOption -PredictionSource 'History'
Выбор подходящей команды в режиме IntelliSense
Вы­бор под­ходящей коман­ды в режиме IntelliSense

Ввод команды в несколько строк

По умол­чанию нажатие кла­виши Enter при наборе коман­ды завер­шает ее ввод, пос­ле чего обо­лоч­ка опре­деля­ет, чем явля­ется вве­ден­ная стро­ка:

Нап­ример, вычис­лим зна­чение выраже­ния 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, здесь отне­сена к одной из катего­рий:

Из­менить сочета­ния кла­виш поз­воля­ет коман­да 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 --version, которая дол­жна вывес­ти информа­цию о вер­сии 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 $PROFILE) и добавить туда нуж­ную коман­ду или прос­то выпол­нить коман­ду 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 status
On branch master
No commits yet
nothing 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.txt в индекс 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.txt, добавив в него стро­ку:

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.txt:

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.txt из рабоче­го катало­га:

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 ~0 -0), а в рабочем катало­ге теперь один новый файл (+1), один изме­нен­ный файл (~1) и один уда­лен­ный файл (-1).

Соз­дадим ком­мит (зафик­сиру­ем изме­нения в репози­тории), в который вой­дут фай­лы file1.txt и file2.txt из индекса:

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 NF в качес­тве шриф­та для про­филя Windows PowerShell в тер­минале Windows. Это мож­но сде­лать на вклад­ке Appearance в нас­трой­ках про­филя Windows PowerShell.

Настройка шрифта для профиля PowerShell в терминале Windows
Нас­трой­ка шриф­та для про­филя PowerShell в тер­минале Windows

Установка модуля Oh My Posh

Мо­дуль Oh My Posh уста­нав­лива­ется стан­дар­тно:

PS C:\Users\andrv> Install-Module oh-my-posh -Scope CurrentUser -Force

Мо­дуль доволь­но объ­емный, уста­нов­ка его может занять про­дол­житель­ное вре­мя.

Пос­ле уста­нов­ки с помощью коман­ды Get-PoshThemes мож­но пос­мотреть все стан­дар­тные встро­енные темы офор­мле­ния, которые под­держи­вает Oh My Posh.

Темы оформления модуля Oh My Posh
Те­мы офор­мле­ния модуля Oh My Posh

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

Установка темы оформления agnoster
Ус­танов­ка темы офор­мле­ния agnoster

Те­перь в приг­лашении коман­дной стро­ки отоб­ража­ются име­на поль­зовате­ля и компь­юте­ра, путь к текуще­му катало­гу от домаш­него катало­га и имя текущей вет­ки в Git-репози­тории.

Для авто­мати­чес­кого при­мене­ния выб­ранной схе­мы при заг­рузке PowerShell нуж­но добавить коман­ду Set-PoshPrompt -Theme agnoster в про­филь PowerShell (напом­ню, что путь к про­филю хра­нит­ся в перемен­ной $PROFILE).

По умол­чанию в теме agnoster отклю­чен вывод под­робной информа­ции о сос­тоянии Git-репози­тория, которую пре­дос­тавля­ет модуль posh-git. Что­бы вклю­чить эту информа­цию, в кон­фигура­цион­ный JSON-файл с нас­трой­ками темы нуж­но внес­ти изме­нения, опи­сан­ные в до­кумен­тации модуля Oh My Posh.

Путь к катало­гу с темами мож­но пос­мотреть в кон­це вывода коман­ды Get-PoshThemes.

Путь к каталогу с темами Oh My Posh
Путь к катало­гу с темами Oh My Posh

Вы­пол­нив коман­ду dir для это­го катало­га, мы по наз­ванию схе­мы узна­ем имя соот­ветс­тву­юще­го кон­фигура­цион­ного фай­ла (для нашей схе­мы agnoster это файл agnoster.omp.json). Его нуж­но открыть в тек­сто­вом редак­торе и добавить в раз­дел, свя­зан­ный с Git, параметр "properties":

{ "display_status": true }:
{
"type": "git",
"style": "powerline",
"powerline_symbol": "\uE0B0",
"foreground": "#193549",
"background": "#95ffa4",
"properties": {
"display_status": true
}
}

Пос­ле сох­ранения кон­фигура­цион­ного фай­ла и переза­пус­ка обо­лоч­ки мы в приг­лашении коман­дной стро­ки уви­дим информа­цию о ста­тусе фай­лов в рабочем катало­ге и индексе Git.

Информация о состоянии файлов в Git-репозитории для темы agnoster
Ин­форма­ция о сос­тоянии фай­лов в Git-репози­тории для темы agnoster

Оформляем списки файлов и каталогов: модуль 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
Спи­сок фай­лов и катало­гов пос­ле под­клю­чения модуля Terminal-Icons

Ес­ли тебе пон­равил­ся такой фор­мат отоб­ражения фай­лов и катало­гов, то коман­ду импорти­рова­ния модуля Terminal-Icons сле­дует добавить в про­филь PowerShell (напом­ню, что путь к про­филю хра­нит­ся в перемен­ной $PROFILE).

Выводы

Мы рас­смот­рели раз­личные спо­собы нас­трой­ки PowerShell для повыше­ния про­дук­тивнос­ти и ком­форта работы. Исполь­зование модуля PSReadLine поз­воля­ет не толь­ко уско­рить работу с коман­дами, но и добавить интеллек­туаль­ные фун­кции авто­допол­нения, что осо­бен­но важ­но при написа­нии слож­ных и длин­ных команд. Интегра­ция с сис­темами кон­тро­ля вер­сий через posh-git обес­печива­ет наг­лядное пред­став­ление текуще­го сос­тояния Git-репози­тори­ев пря­мо в коман­дной стро­ке, что удоб­но как для раз­работ­чиков, так и для сис­темных адми­нис­тра­торов.

Нас­трой­ка визу­аль­ной сос­тавля­ющей с исполь­зовани­ем Oh My Posh и Terminal-Icons не толь­ко улуч­шает внеш­ний вид тер­минала, но и помога­ет мгно­вен­но ори­енти­ровать­ся в фай­ловой сис­теме, добав­ляя цве­товые мет­ки к объ­ектам.

Каж­дый из пред­ложен­ных инс­тру­мен­тов мож­но адап­тировать под свой стиль работы, делая вза­имо­дей­ствие с сис­темой и эффектив­ным, и эсте­тичес­ки при­ятным.