PowerShell: Verlaufsverbesserungen (Readline)?

12

Einige der Dinge, die ich in Bash mag und gerne wissen würde, wie man in PowerShell vorgeht:

  1. In Bash habe ich das Scrollen des Verlaufs so eingerichtet, dass nur Befehle gescrollt werden, die mit demselben Präfix wie die aktuelle Zeile beginnen. Wenn ich mein letztes Commit sehen möchte (z. B. um einen Teil des Kommentars wiederzuverwenden), schreibe ich 'git' und dann .

  2. Verwandt ist natürlich die Verlaufssuche mit Ctrl+R

  3. Um andere Dinge zu finden, schreibe ich:

    h | grep foo
    

    In PowerShell verwende ich:

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

    (Offensichtlich bin ich ein Neuling, es muss einen kürzeren Weg geben)

  4. Dinge wie:

    mv file.txt{,.bak}
    

    oder

    mv file.txt !#$.bak
    
  5. Magischer Raum (der sich !$inline erweitert )

Was sind die Alternativen in PowerShell?

IttayD
quelle

Antworten:

2

Für (3) können Sie es als Funktion in Ihr Profil schreiben (zB %USERPROFILE%\My Documents\WindowsPowerShell\profile.ps1):

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

Dann:

hh foo

Powershell wird jedoch am besten als Skriptsprache und nicht als interaktive Shell betrachtet, da die zugrunde liegende Konsole mit all ihren Einschränkungen immer noch cmd.exe ist.

Es ist also F7 für den interaktiven Verlauf, F3 zum Kopieren des vorherigen Befehls, F1 zum Kopieren eines einzelnen Zeichens, F2 zum Kopieren des vorherigen Befehls auf ein bestimmtes Zeichen usw. usw.

njd
quelle
1
Die zugrunde liegende Konsole ist noch cmd? Das habe ich nicht gedacht.
sinni800
1
Die Konsole ist das Windows-Konsolensubsystem, das auch von cmd und anderen Konsolenanwendungen verwendet wird. Es hat viele seltsame Dinge, wie Streams und Befehlsbearbeitung und seltsame Auswahl und TAB-Vervollständigung. Powershell ISE v3 ist sehr gut, funktioniert aber nicht gut mit "Legacy" -Konsolen-Apps. Cmdlets sind in der ISE großartig.
Jay Bazuzi
15

1 - Sie können F8über die Windows-Konsole Befehle durchlaufen, die dem Anfang der aktuellen Zeile entsprechen. Dies ist eine Übereinstimmung zwischen Groß- und Kleinschreibung.

2 - Sie können verwenden #, um vorherige Befehle abzugleichen. Die Verwendung unterscheidet nicht zwischen #<partial match><tab>Groß- und Kleinschreibung und stimmt mit dem Text an einer beliebigen Position in den vorherigen Befehlen überein.

Wenn Sie den folgenden Befehlsverlauf haben:

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

Die Eingabe #prdann tabwird wiederholt Zyklus durch 1, 2 und 3.

Wenn Sie #stdann tabwiederholt tippen, werden 1 und 3 durchlaufen.

Wenn Sie nur # verwenden, wird der gesamte Verlauf abgeglichen.

#kann auch nach Eingabe eines Teils eines Befehls verwendet werden. Wenn Ihre Geschichte ist:

'notepad'
select *

Sie können eingeben Get-Process #n<tab>| #s<tab>, um zu erhaltenGet-Process 'notepad'| select *

3 - Sie können verwenden Select-String. Erstellen Sie einen Alias, um die Verwendung zu vereinfachen (PowerShell v3 hat den Alias ​​hinzugefügt sls). Sie könnten dann tun.

h| sls foo

4 - Sie können so etwas tun:

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

5 - $$Entspricht dem letzten Token des letzten Befehls, aber ich kenne keine Möglichkeit, ihn inline zu erweitern.

Rynant
quelle