Сохранение введенной команды PowerShell для последующего использования

Предположим, вы работаете в консоли 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.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s