Ausführen von PowerShell über eine Batch

PowerShell Skripte oder CmdLets lassen sich auch über eine Batchdatei (.cmd / .bat) ausführen. Das geht recht einfach und sogar Parameter können mit angegeben werden. Es muss lediglich auf korrekte gesetzte Quoten (Anführungszeichen) geachtet werden.

:: Variables
set log="%temp%\Expand-Raw.log"

:: Header
echo Expand-Raw ...
echo Expand-Raw ... >%log%
echo.

for /f "tokens=*" %%a in ('dir RAW*.zip /b') do (

	rem  PowerShell -NoExit "&" ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"
	PowerShell ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"
	echo [RC=%ERRORLEVEL%], PowerShell -NoExit "&" ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'" >>%log%

)

:_End

Schauen wir uns das PowerShell-Skript genauer an, dann sehen wir das insgesamt 4 Parameter übergeben werden:

  • -Action und die entsprechende Aktion, also –Action dis
  • -File und Dateiname, also –File ‘RAW 2017-01-08-01, Huskies auf der Alb.zip’

Der Aufruf unter PowerShell (also nicht über eine Batch sieht wie folgt aus):

.\Distribute-Pictures.ps1 -Action dis -File 'RAW 2017-01-08-01, Huskies auf der Alb.zip'

Die Batch Datei, welche nun drum herum abläuft, soll das PowerShell-Skript einfach mehrfach für eine Reihe von Dateien im gleichen Verzeichnis ausführen. Darum erfolgt ein Aufruf von PowerShell.exe mit dem Script und den Parametern aus der Batch heraus.

PowerShell ""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"

PowerShell ruft die PowerShell.exe auf, danach wird der vollständige Aufruf für PowerShell in normale Anführungszeichen gesetzt.

""P:\Code\Distribute-Pictures.ps1" -Action dis -File '.\%%a'"

Innerhalb dieser Anführungszeichnen (“) steht dann das PowerShell-Script in weiteren Anführungszeichen, gefolgt von den Parametern. Der letzte Parameter, welcher den Dateinamen darstellt, wird in einfache Anführungszeichen (‘) gesetzt, da ihn PowerShell dann literal behandelt.

Enjoy it, b!