Wo ist mein Dir /S?

Überzeugte Anhänger der Eingabeaufforderung Cmd.exe (gerne auch „DOS-Box“ genannt) werden bei ihren ersten Gehversuchen mit der PowerShell mit Sicherheit irgendwann ein dir /s eingeben und feststellen, dass es nicht funktioniert und stattdessen eine relativ verständnislose Fehlermeldung erscheint. Komisch, ein Dir scheint es zu geben, ein Dir /s wohl nicht. Hintergrund ist natürlich, dass Dir bei der PowerShell „in Wirklichkeit“ nur ein Alias für get-childitem ist und es hier natürlich kein /S-Parameter gibt, der, sollte es ihn geben, auch über -S hätte aufgerufen werden müssen (ich musste mich gerade noch einmal selber vergewissern, dass ein Dir -S nicht doch zum gewünschten Ergebnis führt).

Doch wie bekommt man denn nun den Inhalt des aktuellen Verzeichnisses samt seiner Unterverzeichnisse? Ganz einfach über den Recurse-Parameter und da sich bei der PowerShell Parameternamen solange verkürzen lasssen solange sie eindeutig bleiben, genügt ein

get-childitem -r

oder natürlich ein dir -r. Allzu groß ist der Unterschied zum Dir /s also nicht.

Wer aber ein dir *.ps1 -r probiert wird feststellen, dass sich die Suche nur auf das aktuelle Verzeichnis beschränkt und der Recurse-Parameter ignoriert wird.  Dieser funktioniert nur, wenn der Path-Parameter, der bislang weggelassen wurde, auf ein Verzeichnis zeigt, z.B. auf das aktuelle Verzeichnis über den . oder auf ein anderes Verzeichnis.

Noch einen kleinen Unterschied gibt es. Ein Dir /s findet vermutlich sehr viel mehr Dateien als ein get-childitem. Der Grund ist, dass Dir /s auch Zip-Archive durchsucht (das lässt sich offenbar nicht unterbinden), während das bei get-childitem nur dann der Fall ist, wenn der Force-Parameter gesetzt wird. Das Pendant zu einem Dir /s ist damit z.B. ein

dir -path . -include *.ps1 -r -force

Nicht immer besticht die PowerShell durch Einfachheit, doch es spricht nichts dagegen, sich ein eigenes Dir-Kommando als Funktion zu definieren und diese über die Profile-Datei zum festen Bestandteil der PowerShell zu machen.

Und dem was immer noch zu modern ist, kann sein dir /s natürlich über ein

&“$env:comspec“ /c Dir /s

aufrufen. Dann ist alles so wie „früher“.

Schreibe einen Kommentar

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

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