Daten|teiler
Kopieren als Kulturtechnik

PowerShell-Workshop: Dateilisten erzeugen und auch drucken

22. September 2011 von Christian Imhorst

Das aktuelle Heft 04/2011 von Ubuntu User feiert eine Premiere: Im ersten Bash-Workshop erfährt man, wie man in der Konsole Dateien in einem Verzeichniss auflistet, zurechtschnitzt und ausdruckt. Bash-Skripte erstellen kann ich schon, ich will aber PowerShell lernen. Also habe ich den Workshop etwas abgewandelt.

Die Suche nach einem Editor mit integrierter Shell kann man bei der PowerShell etwas abkürzen, da man im Zielverzeichnis der Installation PowerShell ISE findet. Die drei Buchstaben stehen für Integrated Scripting Environment, eine grafische Benutzeroberfläche, mit der man im selben Fenster nicht nur Befehle, sondern auch Skripte ausführen, schreiben und bearbeiten kann. Ziel des Workshops ist es, eine Liste von MP3-Dateien ohne Dateiendung zu erzeugen. Um eine Dateiliste auszugeben gibt es dank der Aliase viele Möglichkeiten. So kann man wie in der Bash ls nehmen, oder auch dir. Dahinter verbirgt sich jedes Mal das Cmdlet get-childitem, kurz gci.

.

Wie man auf der Abbildung sieht, listet get-childitem mehr Parameter auf, als man vielleicht möchte. Ich will zum Beispiel nur den Namen und nicht die anderen drei Parameter Mode, LastWriteTime und Length. Um die anderen Parameter auszuschließen, braucht man nur den eingeben, den man möchte. In meinem Fall also:

gci -Name

Um die MP3-Endungen der Auflistung zu entfernen, wird im Workshop der Befehl sed benutzt, den es leider in einer Standard-Installation von Windows nicht gibt. Anstelle von sed und einem regulären Ausdruck verwende ich eine ForEach-Schleife mit dem Replace-Parameter, die durch eine Liste von Objekten geht und dabei jedes Objekt einzeln abarbeitet. Das jeweilige Objekt wird in der Schleife mit $_ angesprochen, ein Platzhalter in der aktuellen Pipeline. Eine Eigenschaft eines Objekts wird dann mit $_.NameDerEigenschaft angesprochen. Solche Platzhalter heißen Automatische Variable. Wer genau wissen möchte, welche Automatische Variable es in der PowerShell gibt, kann sich mit folgendem Befehl einen Überblick verschaffen:

get-help about_automatic_variables

Eine Auflistung der MP3-Dateien im Verzeichnis, aber ohne die Dateiendungen, sähe dann folgendermaßen aus:

gci -Name | foreach {$_ -replace ".mp3", ""} > titelliste.txt

Mit der Umleitung in die Textdatei titelliste.txt wird die Dateiliste nicht in die Konsole geschrieben, sondern gleich in die Textdatei hinein, die für die CD-Hülle ausgedruckt werden soll. Führt man den Befehl ein zweites Mal aus, stößt man allerdings auf ein Problem: In der Textdatei stehen nicht nur die Titel, sondern auch der Name der Textdatei, weil die sich nun ebenfalls im Verzeichnis befindet. Damit sie nicht angezeigt wird, kann man alle Dateien mit der Endung TXT von der Liste ausschließen.

gci -Name -Exclude *.txt | foreach {$_ -replace ".mp3", ""} > titelliste.txt

Ich möchte auch gerne überprüfen, welche Infos in die Textdatei geschrieben werden und zur Kontrolle die Dateien zusätzlich auch noch in der Konsole ausgeben. Im Workshop von Ubuntu User wird dazu der Befehl tee benutzt, der wie ein T-Stück die Ausgabe in zwei Richtungen lenkt. Das Commandlet Tee-Object bewirkt in der PowerShell dasselbe und die Kurzform ist wie in der Bash tee. Das vollständige Kommando zur Ausgabe des Verzeichnisses mit den MP3-Dateien auf der Konsole und in eine Textdatei sieht dann so aus:

gci -Name -Exclude *.txt | foreach {$_ -replace ".mp3", ""} | tee titlliste.txt
01 sad robot
02 take me to the bonuslevel because i need an extralife
03 lemmings in love
04 space invaders
05 i want to be a machine
06 1_2 player game
07 game over
08 rock'n'roll hall of fame

Den Inhalt der Textdatei kann man dann auch ausdrucken, falls man schnell mal ein CD-Cover mit den Songs drauf braucht. Dazu muss man aber erstmal wissen, welche Drucker am Rechner überhaupt angeschlossen sind. In der Bash klappt das mit dem Befehl lpstat -a, in der PowerShell benötigt man dazu ein WMI-Objekt wie win32_printer.
Das Cmdlet für die WMI-Objekte heißt Get-WmiObject oder kurz gwmi. Mit der Umleitung in das Select-Objekt wird dann nur der Name des Druckers angezeigt:

gwmi win32_printer | select name
 
name
----
Brother HL-2030 series
Microsoft XPS Document Writer

Wenn man den Drucker weiß, kann man den Inhalt der Textdatei zum Drucker umleiten, wofür in der Bash der Befehl lp zuständig ist:

Get-Content titlliste.txt | Out-Printer -name "Brother HL-2030 series"

Geschrieben in Powershell, Windows