Wie übergebe ich einen Scriptblock als einen der Parameter im Startjob?

Ich versuche einen Hintergrundjob zu erstellen, der einen Scriptblock ausführt. Ich muss diesen Scriptblock als Parameter übergeben, aber ich kann die Syntax scheinbar nicht zum Laufen bringen. Der Scriptblock wird unterwegs in einen String konvertiert.

Es funktioniert einwandfrei, wenn ich den Skriptblock an eine lokale Funktion übergebe, aber nicht über start-job

Die folgende Syntax funktioniert:

function LocalFunction
{
    param (
        [parameter(Mandatory=$true)]
        [ScriptBlock]$ScriptBlock
    )

    &$ScriptBlock | % { echo "got $_" }
}

LocalFunction -ScriptBlock { echo "hello" }

Diese Ausgabe wurde wie erwartet "Hallo".

Folgendes schlägt jedoch fehl:

$job = start-job -argumentlist { echo "hello" } -scriptblock {
    param (
        [parameter(Mandatory=$true)]
        [ScriptBlock]$ScriptBlock
    )
    &$ScriptBlock | % { echo "got $_" }
}
start-sleep -s 1
receive-job $job

Der zurückgegebene Fehler ist

Receive-Job : Cannot process argument transformation on parameter 'ScriptBlock'. Cannot convert the " echo "hello" " value of type "System.String" to type "System.Management.Automation.ScriptBlock".

Wenn ich also den Fehler richtig lese, sieht es so aus, als würde -argumentlist seine Argumente irgendwie in Strings zwingen.

Wissen Powershell-Gurus, wie diese Syntax funktioniert?

Danke im Voraus,

Ben

Antworten auf die Frage(5)

Ihre Antwort auf die Frage