Einfache Directory History für die PowerShell

Als ich vor einiger Zeit begann, mit der PowerShell zu arbeiten, vermisste ich eine Directory History, also eine Liste mit den zuletzt besuchten Directories und darauf basierend dann eine einfache Möglichkeit, wieder in eine dieser Directories zurückzukehren. Wie man bei Microsoft im Kapitel Managing Current Location der PowerShell-Doku sieht, gibt es zwar einen Stack mit Hilfe von Push-Location und Pop-Location, aber das ist weder automatisch noch besonders praktisch.

Per Google fand ich relativ schnell heraus, dass die PowerShell Community Extensions unter vielen anderen Dingen einen cd-Befehl enthalten, der eine History führt, aber alleine deswegen diese Extensions zu installieren erschien mir als Overkill.

Da cd nur ein Alias ist, kann man diesen Alias relativ leicht ersetzen und das Führen einer Liste besuchter Directories anhängen, wie man es z.B. hier sieht. Aber das gefiel mir auch nicht besonders, denn ich wollte mir nicht Sorgen darüber machen müssen, ob die aktuelle Directory irgendwie an dieser neuen cd-Funktion vorbei wechseln kann, z.B. durch direkte Verwendung von Set-Location in einem Script, und die History dann „Löcher“ bekommt.

Schliesslich hatte ich eine Idee, die zwar etwas hack-mässig ist, dafür aber einfach und zuverlässig funktioniert: Im Profile-Script gibt es eine Function Prompt, welche dazu da ist, wie der Name schon sagt, jeweils den Prompt am Anfang der Kommandozeile auszugeben. (Einige schöne Ideen, was man damit alles machen kann, findet man z.B. hier.) Aber wer sagt denn, dass man in diesem Script nur Ausgaben machen darf? Ebensogut kann man nebenbei beobachten, in welcher Directory man neuerdings gelandet ist, und so auf einfache Weise eine zuverlässige History führen!

Veröffentlicht in Keine Kategorie. Schlagwörter: . 3 Comments »

3 Antworten to “Einfache Directory History für die PowerShell”

  1. Dr. Heiko Voss Says:

    Fand den Blog interessant, da die meisten ja den Alias cd killen und dann ein eigenes Cmdlet für cd schreiben. Kannst Du bitte den relevanten Code-Schnipsel bloggen, wie Du das im Prompt erledigt hast?

    • René Brunner Says:

      Ok, das ganze ist ziemlich schlechter Code als Resultat meiner ersten Gehversuche mit der PowerShell, aber die Idee mit der Prompt-Funktion und der Aufbewahrung der History in Form einer Environment-Variable sollte ersichtlich sein:


      function ArrayToStr {
      param($array)
      $str=""
      $array | foreach {$str+=";"+$_.tostring()}
      return $str.remove(0,1)
      }

      $env:dirHist="C:\"

      function prompt {
      Write-Host ((get-location).ToString() + ">") -nonewline
      $dirHist=$env:dirHist.split(";")
      if ($dirHist.count -gt 10) {
      $null, $dirHist = $dirHist
      }
      $loc=((get-location).ToString())
      if ($loc -ne $dirHist[$dirHist.count-1]) {
      $dirHist+=$loc
      }
      $env:dirHist=ArrayToStr($dirHist)
      return " "
      }

      • Dr. Heiko Voss Says:

        Hallo René,

        vielen Dank für die schnelle Antwort. Habe leider keine Benachrichtigungsmail bekommen, deshalb erst jetzt die Reaktion.

        Eine wirklich gute Idee. Glückwunsch! Muss man erst Mal drauf kommen.


Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: