Tags: Datei-Management, PowerShell
Im Gegensatz zu Visual Basic Script ist PowerShell nicht nur eine Script-Umgebung, sondern auch eine interaktive Shell. Daher möchte man dort Äquivalente zu den in cmd.exe tagtäglich genutzten Befehlen finden. Das Gegenstück zum Allerweltskommando dir ist in Powershell Get-ChildItem, nur mit dem Unterschied, dass es wesentlich mehr kann.
Im Vergleich zu dir oder ls unter Unix ist Get-ChildItem aufgrund der Namenskonvention in PowerShell für ein so häufig benötigtes Kommando zu lang. Daher existieren drei vordefinierte Aliase, nämlich gci, ls und dir. Letzteres sollte wohl den Wechsel von cmd.exe auf PowerShell vereinfachen, das Problem ist nur, dass auch das Alias die Parameter von Get-ChildItem erwartet und mit den Schaltern des dir-Befehls nichts anfangen kann.
Schalter für versteckte Dateien und Unterverzeichnisse
In der einfachsten Variante verhält sich das Cmdlet wie der dir-Befehl unter cmd.exe, sprich der Aufruf ohne Parameter listet die Dateien im aktuellen Verzeichnis auf, wenn auch in einer anderen Darstellung.
Wie von dir gewohnt, scheinen dabei Dateien mit dem Hidden- oder System-Attribut nicht auf. Wenn man das möchte, ruft man gci mit dem Parameter -force auf. Will man auch Dateien aus Unterverzeichnissen anzeigen, also ein Äquivalent zu dir /s, dann hängt man den Schalter -recurse an.
Mehrere Pfade in einem Aufruf
Ein wesentlicher Unterschied zu dir besteht darin, dass Get-ChildItem nicht nur die Dateien unterhalb eines Verzeichnisses anzeigen kann, sondern den Inhalt mehrerer Teilbäume auflistet, wenn man ihm die Pfade durch Komma getrennt übergibt:
gci .\Documents, .\Downloads, .\Pictures
Die eigentliche Stärke von PowerShell und damit auch von gci zeigt sich, wenn man das Ergebnis nach verschiedenen Kriterien filtern oder weiterverarbeiten möchte. Einfache Fälle wären zum Beispiel, dass man nur die Dateinamen anzeigen oder die Zahl der ermittelten Dateien sehen möchte. Ersteres lässt sich durch das Anhängen des Parameters -name bewerkstelligen.
Dateien in Verzeichnissen zählen
Das Zählen der Dateien ist ebenfalls recht simpel, weil Get-ChildItem ein Array (Collection) von FileInfo-Objekten zurückgibt. Daher muss man nur über die count-Eigenschaft abfragen, wie viele Mitglieder die Collection hat:
(gci .\Documents, .\Downloads, .\Pictures -filter *.zip).count
Dieser Aufruf ermittelt die Anzahl der ZIP-Archive unterhalb der 3 angegebenen Verzeichnisse.
Nach Attributen filtern
Eine häufige Anwendung von dir besteht darin, nur Dateien anzuzeigen, die ein bestimmtes Attribut gesetzt haben, also zum Beispiel dir /ad, um nur Verzeichnisse zu erfassen. In PowerShell würde dies so aussehen, wobei hier auch versteckte Ordner mit in der Liste sind:
gci -force | where {$_.mode -match "d"}
oder
gci -force | where {$_.attributes -match "Directory"}
Bei mode und attributes handelt es sich um zwei von vielen Eigenschaften eines FileInfo-Objekts, auf die man für verschiedene Zwecke zurückgreifen kann. So lassen sich etwa mittels length alle Dateien anzeigen, die eine bestimmte Größe überschreiten (in diesem Fall 250000 Bytes):
gci .\Pictures -recurse -filter *.png | where {$_.length -gt 250000}
Dateiliste sortieren
Die Eigenschaften von Dateien kann man auch heranziehen, um sie darüber zu sortieren, etwa nach der Erweiterung:
gci .\documents -force | sort -property extension
Individuelles Anpassen der Ausgabe
Durch den gezielten Zugriff auf die Eigenschaften von FileInfo-Objekten kann man auch die Ausgabe von gci nach Gutdünken verändern:
gci .\documents -force | where {$_.mode -notmatch "d"} | select name, length
In diesem Beispiel würden alle Dateien (aber keine Verzeichnisse) unterhalb von Documents erfasst, die Ausgabe reduziert sich dabei auf den Namen und die Größe der Datei. Als weitere Eigenschaften, die man auf diese Weise gezielt extrahieren kann, existieren z.B. der volle Dateiname inklusive Pfad (FullName), der Dateiname ohne Extension (BaseName) oder nur der Pfad (Directory).
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
Weitere Links
1 Kommentar
Verständliche Erklärung, danke :)