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

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

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

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

 

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

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

  • син­такси­чес­ки вер­ной завер­шенной коман­дой или выраже­нием 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 — фун­кции для поис­ка сим­волов в стро­ке вво­да.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии