Предположим, вы работаете в консоли PowerShell и ввели большую и сложную команду. В этот момент вы понимаете, что забыли определить переменную, создать удаленную сессию и мало ли что еще. Вы удаляете введенную команду, выполняете необходимые действия и вводите ее заново.
Знакомо?
В этой статье мы поговорим о нескольких подходах, что могут нам помочь в подобных ситуациях.
Чтобы не слишком отвлекаться от основной темы статьи, решим, что нашей большой и сложной командой будет получение объектов процессов.
Get-Process -Name $ProcessName
А пропущенной командой будет определение переменной $ProcessName.
$ProcessName = 'pwsh'
Adding lines
Во-первых, мы можем добавить необходимую команду, завершив ее символом точки с запятой, непосредственно перед уже введенной.
$ProcessName = 'pwsh'; Get-Process -Name $ProcessName
Или же, введя команду Get-Process, мы можем нажать сочетание клавиш Ctrl+Enter, что добавит пустую строку перед уже введенной командой и позволит нам ввести пропущенную команду.
$ProcessName = 'pwsh' >> Get-Process -Name $ProcessName
Using clipboard
В ситуации когда вы бы хотели, чтобы различные действия были представлены отдельными командами, вы можете сохранить введенную команду в буфер обмена, выполнить необходимые пропущенные шаги, и вставить ее обратно.
Вы можете это сделать, выделив введенную команду, например, при помощи сочетания клавиш Ctrl+a, и скопировать ее у буфер, при помощи клавиш Ctrl+с.
Кроме того, вы можете скопировать введенную команду без предварительного выделения при помощи сочетания клавиш Ctrl+Shift+c. Нужно сказать, что в параметрах модуля PSReadline это сочетание клавиш указывается как указывается как Ctrl+C.
PSReadline
Если же мы заглянем в каталог модуля PSReadline и посмотрим на содержимое файла SamplePSReadLineProfile.ps1, то, кроме всего прочего, увидим там следующее.
Set-PSReadLineKeyHandler -Key Alt+w ` -BriefDescription SaveInHistory ` -LongDescription "Save current line in history but do not execute" ` -ScriptBlock { param($key, $arg) $line = $null $cursor = $null [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor) [Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory($line) [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine() }
Эта команда позволяет привязать к сочетанию клавиш Alt+w код, указанный в качестве значения параметра ScriptBlock.
Таким образом, использование вышеприведенного сочетания клавиш приведет к тому, что введенная нами команда будет добавлена в историю команд и удалена из командной строки, как если бы мы нажали Escape. После того, как мы выполним все необходимые действия мы можем вернуться к этой команде при помощи механизмов работы с историей команд, например, клавиши Вверх.
Что касается предложенного сочетания клавиш, то вы можете задать его по своему усмотрению. Я лично предпочел бы, чтобы используемый символ был ближе к клавише Enter, например Ctrl+’. В этом случае, код обретет следующий вид.
Set-PSReadLineKeyHandler -Key "Ctrl+'" ` -BriefDescription SaveInHistory ` -LongDescription "Save current line in history but do not execute" ` -ScriptBlock { param($key, $arg) $line = $null $cursor = $null [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor) [Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory($line) [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine() }
Для того, чтобы не вводить вышеприведенную команду в каждой сессии, вы можете добавить ее в профиль.
Return
В этой статье мы рассмотрели несколько методов, которые мы можем использовать при работе в консоли PowerShell в тех случаях, когда выясняется, что введенная нами команда требует выполнения некоторых предварительных действий и мы бы не хотели, чтобы нам пришлось вводить эту команду заново.
Каждый из представленных методов может быть полезен в определенных ситуациях и, кроме того, как мы видели в последнем примере, мы можем использовать функциональность модуля PSReadline для назначения скриптов различным сочетаниям клавиш, что дает нам некоторую свободу в определении того, как будет работать наша консоль PowerShell.