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?

Відповіді:


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


1
Основна консоль IS все ще cmd? Я так не думав.
sinni800

1
консоль - це підсистема консолі Windows, яка також використовується cmd та будь-яким іншим додатком консолі. У ньому є багато дивних речей, таких як потоки та редагування команд, дивний вибір та завершення TAB. Powershell ISE v3 дуже хороший, але не працює добре з "застарілими" консольними програмами. Cmdlets чудові в 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 - $$відповідає останньому маркеру останньої команди, але я не знаю способу розширити його в рядку.


2

Ви повинні перевірити модуль PSReadline Oisin Grehan: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

Код доступний тут: https://bitbucket.org/oising/psreadline/overview

Це робить PowerShell фактично корисним як CLI, з точки зору досвідчених адміністраторів * nix, які періодично працюють з Windows, додаючи основні прив'язки EMACS для редагування рядків, пошуку історії тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.