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. Волшебное пространство (которое расширяется !$ inline)

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

3 ответа3

14

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

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

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

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

#pr затем tab , переключает 1, 2 и 3.

#st табуляция циклически перебирает 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 - $$ соответствует последнему токену последней команды, но я не знаю, как его встроить.

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 для копирования предыдущей команды до определенного символа и т.д., И т.д.

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 для редактирования строк, поиска в истории и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .