PowerShell: Verlaufsverbesserungen (Readline)?

2886
IttayD

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

  1. In Bash habe ich den Verlaufslauf für die Geschichte so eingerichtet, dass nur Befehle verschoben werden, die mit demselben Präfix wie die aktuelle Zeile beginnen. Wenn ich mein letztes Commit sehen möchte (zB um einen Teil des Kommentars wiederzuverwenden), schreibe ich 'git' und dann .

  2. In Verbindung steht natürlich die Historiesuche 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")} 

    (Natürlich 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 !$inline erweitert wird )

Welche Alternativen gibt es in PowerShell?

12

3 Antworten auf die Frage

14
Rynant

1 - Sie können F8von der Windows-Konsole aus Befehle ausführen, die mit dem Anfang der aktuellen Zeile übereinstimmen. Dies ist eine Übereinstimmung zwischen Groß- und Kleinschreibung.

2 - Sie können #vorherige Befehle verwenden. Bei der Verwendung #<partial match><tab>wird die Groß- und Kleinschreibung nicht beachtet und der Text wird an jeder Position in den vorherigen Befehlen angezeigt.

Wenn Sie den folgenden Befehlsverlauf haben:

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

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

Durch wiederholtes Tippen werden #stdann tab1 und 3 durchlaufen.

Die Verwendung von # stimmt mit der gesamten Historie überein.

#kann auch verwendet werden, nachdem ein Teil eines Befehls eingegeben wurde. Wenn Ihre Geschichte ist:

'notepad' select * 

Sie können tippen Get-Process #n<tab>| #s<tab>, um zu bekommenGet-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 es dann tun.

h| sls foo 

4 - Sie können so etwas tun:

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

5 - $$stimmt mit dem letzten Token des letzten Befehls überein, aber ich weiß nicht, wie er inline erweitert werden kann.

2
njd

Für (3) können Sie es als Funktion in Ihr Profil schreiben (z. B. %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 immer noch cmd.exe mit all ihren Einschränkungen ist.

Es ist also F7 für interaktive Historie, F3 zum Kopieren des vorherigen Befehls, F1 zum Kopieren eines einzelnen Zeichens, F2 zum Kopieren des vorherigen Befehls bis zu einem bestimmten Zeichen usw. usw.

Die zugrunde liegende Konsole ist immer noch cmd? Ich habe nicht so gedacht. sinni800 vor 11 Jahren 1
Die Konsole ist das Windows-Konsolensubsystem, das auch von cmd und anderen Konsolenanwendungen verwendet wird. Es hat eine Menge seltsamer Dinge, wie Streams und Befehlsbearbeitung und seltsame Auswahl und TAB-Abschluss. PowerShell ISE v3 ist sehr gut, funktioniert aber nicht gut mit "alten" Konsolen-Apps. Cmdlets sind großartig in der ISE. Jay Bazuzi vor 11 Jahren 1
2
Joe Carroll

You should check out Oisin Grehan's PSReadline module: http://nivot.org/blog/post/2012/09/12/Emulating-Bash-GNU-Readline-with-PowerShell-30

The code is available here: https://bitbucket.org/oising/psreadline/overview

This makes PowerShell actually usable as a CLI, from the point of view of experienced *nix admins who occasionally work with Windows, by adding basic EMACS bindings for line editing, history search etc.