PowerShell: улучшения истории (readline)?

12

Некоторые вещи, которые мне нравятся в Bash и которые я хотел бы знать, как делать в PowerShell:

  1. В Bash у меня настроена прокрутка истории, чтобы она прокручивала только те команды, которые начинаются с того же префикса, что и текущая строка. Если я хочу посмотреть мой последний коммит (например, повторно использовать часть комментария), я пишу «git», а затем .

  2. Связан, конечно, поиск истории с Ctrl+R

  3. Чтобы найти другие вещи, я пишу:

    h | grep foo
    

    В PowerShell я использую:

    h -c 1000 | where {$_.commandline.contains("foo")}
    

    (очевидно, я новичок, должен быть более короткий путь)

  4. Вещи как:

    mv file.txt{,.bak}
    

    или

    mv file.txt !#$.bak
    
  5. Магическое пространство (расширяется в !$линию)

Каковы альтернативы в PowerShell?

IttayD
источник

Ответы:

2

Для (3) вы можете написать это как функцию в своем профиле (например %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

function hh ([string] $word) {
    Get-History -c 1000 | where {$_.commandline.contains($word)}
}

Потом:

hh foo

Но Powershell лучше всего рассматривать как язык сценариев, а не как интерактивную оболочку, поскольку базовой консолью по-прежнему является cmd.exe со всеми своими ограничениями.

Это F7 для интерактивной истории, F3 для копирования предыдущей команды, F1 для копирования одного символа, F2 для копирования предыдущей команды до определенного символа и т. Д. И т. Д. И т. Д.

NJD
источник
1
Базовая консоль - это все еще cmd? Я так не думаю.
sinni800 15.12.12
1
консоль - это консольная подсистема windows, которая также используется cmd и любым другим консольным приложением. В нем много странных вещей, таких как редактирование потоков и команд, странный выбор и завершение TAB. Powershell ISE v3 очень хорош, но плохо работает с «устаревшими» консольными приложениями. Командлеты великолепны в ISE.
Джей Базузи
15

1 - Вы можете использовать F8из консоли Windows для переключения между командами, которые соответствуют началу текущей строки. Это совпадение с учетом регистра.

2 - Вы можете использовать, #чтобы соответствовать предыдущим командам. Использование #<partial match><tab>не учитывает регистр и будет сопоставлять текст в любой позиции в предыдущих командах.

Если у вас есть следующая история команд:

# 1
$np = Start-Process notepad -PassThru
# 2
$np| get-process
# 3
$np| Stop-Process

Typing #prзатем tabмногократно будет цикл через 1, 2 и 3.

Typing #stзатем tabповторно будет цикл через 1 и 3.

Использование только # будет соответствовать всей истории.

#также может использоваться после ввода части команды. Если ваша история:

'notepad'
select *

Вы можете напечатать, Get-Process #n<tab>| #s<tab>чтобы получитьGet-Process 'notepad'| select *

3 - Вы можете использовать Select-String. Создайте для него псевдоним, чтобы его было легко использовать (PowerShell v3 добавил псевдоним sls). Вы могли бы тогда сделать.

h| sls foo

4 - Вы можете сделать что-то вроде:

gci *a.txt| ren -n {$_.Name + '.bak'}

5 - $$соответствует последнему токену последней команды, но я не знаю, как расширить его в строке.

Rynant
источник
2

Вы должны проверить модуль PSReadline Ойсена Грехана: http://nivot.org/blog/post/2012/09/12/Emulation-Bash-GNU-Readline-with-PowerShell-30

Код доступен здесь: https://bitbucket.org/oising/psreadline/overview

Это делает PowerShell фактически пригодным для использования в качестве интерфейса командной строки, с точки зрения опытных администраторов * nix, которые иногда работают с Windows, путем добавления базовых привязок EMACS для редактирования строк, поиска в истории и т. Д.

Джо Кэрролл
источник