Monthly Archives: August 2012

„eval“-Äquivalent in PowerShell

Heute hatte ich ein vermeintlich einfaches Problem zu lösen:

Ich sollte eine Textdatei mit PowerShell auslesen, welche wiederum PowerShell-Variablen enthält (z.B. $datum, $_.Name, …).

Content.txt:

Hier ist normaler Text
$date

Ergebnis:

Hier ist normaler Text
08/23/2012 09:53:12

Ein einfaches

Get-Content

funktioniert hier nicht, da hierbei die Variablen nicht interpretiert werden und der Text wird so ausgegeben, wie er in der Textdatei steht.

Die Lösung ist, die Methode ExpandString auszuführen, welche in der PowerShell über

$ExecutionContext.InvokeCommand.ExpandString

aufrufbar ist.

$date = Get-Date
$content = Get-Content .\Content.txt    # PowerShell 3 Tipp: -Raw liest die Datei in einem String aus, normalerweise wird ein String-Array ausgelesen.
$content = $ExecutionContext.InvokeCommand.ExpandString($content)

Und schon hat man das gewünschte Resultat. J

Sehr praktisch wenn man z.B. Emails mit einem Body-Template verschicken will.

Man kann sogar so weit gehen, dass man ganze PowerShell-Kommandos ausführen kann (im Prinzip verhält sich der Text wie Text aus einem “Here-String“):

$(get-date)

eval is evil

Wie auch bei eval gilt: Vorsicht, was man einliest, da prinzipiell jedes Kommando im Kontext der ausführenden PowerShell-Instanz ausgeführt wird kann man sehr böse Dinge anstellen!

Advertisements