PowerShell: ulepszenia historii (readline)?

12

Niektóre rzeczy, które lubię w Bash i chciałbym wiedzieć, jak to zrobić w PowerShell:

  1. W Bash mam skonfigurowane przewijanie historii, aby przewijało tylko polecenia rozpoczynające się od tego samego prefiksu, co bieżąca linia. Jeśli chcę zobaczyć moje ostatnie zatwierdzenie (np. Aby ponownie użyć części komentarza), piszę „git”, a następnie .

  2. Powiązane jest oczywiście wyszukiwanie historii za pomocą Ctrl+R

  3. Aby znaleźć inne rzeczy, piszę:

    h | grep foo
    

    W PowerShell używam:

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

    (oczywiście jestem nowicjuszem, musi być krótsza droga)

  4. Rzeczy jak:

    mv file.txt{,.bak}
    

    lub

    mv file.txt !#$.bak
    
  5. Magiczna przestrzeń (która rozszerza się w !$linii)

Jakie są alternatywy w PowerShell?

ItdayD
źródło

Odpowiedzi:

2

W przypadku (3) możesz zapisać go jako funkcję w swoim profilu (np. %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

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

Następnie:

hh foo

Ale Powershell najlepiej jest traktować jako język skryptowy niż jako interaktywną powłokę, ponieważ podstawową konsolą jest nadal cmd.exe ze wszystkimi swoimi ograniczeniami.

Więc F7 to interaktywna historia, F3, aby skopiować poprzednie polecenie, F1, aby skopiować pojedynczy znak, F2, aby skopiować poprzednie polecenie do określonego znaku itp.

njd
źródło
1
Podstawowa konsola JEST nadal cmd? Nie myślałem tak.
sinni800,
1
konsola jest podsystemem konsoli Windows, który jest również używany przez cmd i dowolną inną aplikację konsolową. Ma wiele dziwnych rzeczy, takich jak transmisje strumieniowe i edycja poleceń oraz dziwny wybór i uzupełnianie TAB. Powershell ISE v3 jest bardzo dobry, ale nie działa dobrze z „starszymi” aplikacjami konsolowymi. Polecenia cmdlet są świetne w ISE.
Jay Bazuzi,
15

1 - Za pomocą F8konsoli Windows można przełączać polecenia pasujące do początku bieżącego wiersza. To jest dopasowanie wielkości liter.

2 - Możesz użyć, #aby dopasować poprzednie polecenia. Używanie #<partial match><tab>nie uwzględnia wielkości liter i dopasuje tekst w dowolnej pozycji poprzednich poleceń.

Jeśli masz następującą historię poleceń:

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

Wpisanie #prnastępnie tabwielokrotnie przejdzie przez 1, 2 i 3.

Pisanie, #sta następnie tabkilkakrotnie, będzie przełączać się między 1 i 3.

Użycie tylko # dopasuje całą historię.

#może być również użyty po wprowadzeniu części polecenia. Jeśli twoja historia to:

'notepad'
select *

Możesz wpisać, Get-Process #n<tab>| #s<tab>aby uzyskaćGet-Process 'notepad'| select *

3 - Możesz użyć Select-String. Utwórz alias, aby był łatwy w użyciu (PowerShell v3 dodał alias sls). Mógłbyś wtedy zrobić.

h| sls foo

4 - Możesz zrobić coś takiego:

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

5 - $$pasuje do ostatniego tokena ostatniego polecenia, ale nie znam sposobu na rozwinięcie go w linii.

Rynant
źródło