Powershell-Skripte mit Dateien aus dem Windows Explorer mittels Drag&Drop versorgen


Man wundert sich immer wieder, dass unter Windows die Drag&Drop-Methode seltener zum Einsatz kommt als z. B. bei Mac-Benutzern. Während für viele Mac-Benutzer dies zum täglichen Brot gehört, tun sich Windows Benutzer oft damit schwer, wohl auch aus der Erfahrung heraus, dass bestimmte logische Drag&Drop-Kombinationen einfach nicht funktionieren. Woran liegt dies? An den faulen Programmierern! Um dieser Sache einen Riegel vorzuschieben, hier eine Beschreibung wie man Powershell-Skripte Drag&Drop fähig bekommt.

Folgende Ausgangssituation. Man hat ein sinnvolles Powershell-Skript, welches auf bestimmte Dateien angewendet werden soll. Man könnte nun unter Powershell das Skript schreiben und dem Benutzer sagen, er soll die betreffenden Dateien als Arrayparameter übergeben. Der kuckt einen blöd an und sagt: Bahnhof.

Um dem unbedarften Benutzer die Möglichkeit zu bieten bestimmte Powershell-Skripte auf bestimmte Dateien anzuwenden sollte die Sache über den Windows-Explorer funktionieren. D. h. der Benutzer markiert die gewünschten Dateien und zieht – also per Drag&Drop eine oder mehrere auf das Powershell-Skript und lässt sie dort los. Das Skript bekommt die ausgewählten Dateien als Parameter übergeben und kann seiner Arbeit nachgehen.

Von Hause aus ist dies leider in Powershell nicht vorgesehen. Aber mit einem kleinen Trick und Umweg über Batch-Dateien klappt es dann doch. Dazu benennt man am einfachsten die Batch-Datei wie die Datei mit dem Skript, nur anstatt der Endung .PS1 hat man eben .BAT  oder .CMD.

@ECHO OFF
REM Powershellscript.bat
REM
SET PSScript=%~dpn0.ps1
SET PSScriptPath=%~dp0
SET args=’%1′
:More
SHIFT
IF ‚%1‘ == “ GOTO Done
SET args=%args%,’%1′
GOTO More
:Done
REM funktioniert nur, wenn .BAT gleichen Dateinamen wie .PS1-Datei hat:
Powershell.exe -noprofile -noexit -command ". {$count=0; foreach($file in %args%) {. %PSScript% $file; $count++ }; ‚Processed ‚ + $count; }"

Hat man also das Skript MeinPowershellskript.PS1 und möchte dieses mittels Drag&Drop mit Dateien aus dem Windows Explorer befeuern, dann muss auch obige Batchdatei mit dem Namen MeinPowershellskript.BAT im selben Verzeichnis existieren. Der Benutzer zieht die Dateien auf die .BAT-Datei und nicht auf die .PS1-Datei!

Das Powershell-Skript kann dann mittels der immer verfügbaren Variablen $args die übergebene Datei abfragen und darauf reagieren, z. B. so:

"Datei zum Bearbeiten: $args[0]"
Read-Host "Return zum Beenden drücken"

Werden mehrere Parameter übergeben:

$Index=0
foreach($arg in $args) {
  "$(($Index++)): $arg"
}
Read-Host "Return zum Beenden drücken"

Im obigen Beispiel wird das Powershell-Skript für jede zu bearbeitende Datei separat hintereinander aufgerufen. Manchmal kann es dabei sinnvoll sein, den Pfad zu kennen, wo das Skript liegt. Um dies dem Powershell-Skript mitteilen zu können, kann man den Aufruf des Skripts etwas ändern, aus

{. %PSScript% $file; $count++ }

in

{. %PSScript% $file %PSScriptPath%; $count++ }

Warum aber die Skripte einzeln ausführen und nicht alle Dateien auf einen Schlag übergeben? Bei zu vielen Dateien geht die Eingabeaufforderung in die Knie und bringt blöder Fehlermeldungen, deshalb dieser Weg. Etwas langsamer und umständlicher aber dafür zuverlässiger.

Weitere Infos:

http://stackoverflow.com/questions/2819908/drag-and-drop-to-a-powershell-script

Invocation-Context:
http://gallery.technet.microsoft.com/scriptcenter/cb72e4e6-4a68-4a2e-89b7-cc43a860349e#content

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: