Jak v PowerShellu převést String na ScriptBlock


ScriptBlock je další z vyfikundací Microsoftu, které jsou implementované v PowerShellu. Jedná se o něco jako anonymní funkci, která jako v jiných jazycích může být přiřazena do proměnné.

ScriptBlock se vytváří pomocí složených závorek {} a stejně jako funkce může mít definované parametry a vůbec je to anonymní funkce, takže možnosti netřeba rozepisovat. Problém je však v tom, že ScriptBlok není obyčejný objekt. Jedná se o objekt, který se jmenuje System.Management.Automation.ScriptBlock. Stupidní, že. A protože je stupidní, je problém jen tak do něj něco dostat. Tedy, není to problém, ale pokud chcete, aby jste do příkazu Invoke-Command mohli dostat do parametru -ScriptBlock proměnnou a ta se správně vyhodnotila, je zapotřebí String, který do něj je potřeba předat, přetypovat na ScriptBlock. Jenže jak na to? No naštěstí docela jednoduše, jen je potřeba vědět, jak se to dělá.

$yourString = "dir c:\"
$scriptBlock = [Scriptblock]::Create($yourString)
Invoke-Command -ScriptBlock $scriptBlock

V PS je možnost vytvořit statický ScriptBlock to se dělá takto

$i = 123
$scriptBlock = { $i }.GetNewClosure()
$i = 321
& $scriptBlock