Frage

Ich möchte Hintergrundjobs in Powershell verwenden.

Wie kann man Variablen im Moment der Skriptblockdefinition bewertet?

$v1 = "123"
$v2 = "asdf"

$sb = {
    Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -ScriptBlock $sb

$job | Wait-Job | Receive-Job

$job | Remove-Job

Ich werde leere Werte von $ v1 und $ v2 gedruckt. Wie kann ich sie in (übergeben) in den Skriptblock und so zum Hintergrundjob bewerten lassen?

War es hilfreich?

Lösung

Eine Möglichkeit besteht darin, die [scriptBlock] :: methode erstellen zu verwenden, um den Skriptblock aus einer erweiterbaren Zeichenfolge mit lokalen Variablen zu erstellen:

$v1 = "123"
$v2 = "asdf"

$sb = [scriptblock]::Create("Write-Host 'Values are: $v1, $v2'")

$job = Start-Job -ScriptBlock $sb

Eine andere Methode besteht darin, Variablen im Initializationscript festzulegen:

$Init_Script = {
$v1 = "123"
$v2 = "asdf"
}

$sb = {
    Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -InitializationScript $Init_Script -ScriptBlock $sb 

Eine dritte Option besteht darin, den Parameter -ArgumentList zu verwenden:

$v1 = "123"
$v2 = "asdf"

$sb = {
    Write-Host "Values are: $($args[0]), $($args[1])"
}

$job = Start-Job  -ScriptBlock $sb -ArgumentList $v1,$v2

Andere Tipps

Die einfachste Lösung (die V3 oder höher erfordert) sieht folgendermaßen aus:

$v1 = "123"
$v2 = "asdf"

$sb = {
     Write-Host "Values are: $using:v1, $using:v2"
}

$job = Start-Job -ScriptBlock $sb

Sie können sich $ vorstellen, wie ein explizites Param () -Block- und -ArgumentList ungefähr wie ein explizite Param () verwendet wird. Nur PowerShell verarbeitet das für Sie automatisch.

Deklarieren Sie die Werte als Parameter im Skriptblock und geben Sie sie dann ein. -ArgumentList

$v1 = "123"
$v2 = "asdf"

$sb = {
    param
    (
        $v1,
        $v2
    )
    Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1, $v2

$job | Wait-Job | Receive-Job

$job | Remove-Job

Ich bin nicht an einem Computer, um zu validieren, aber das sollte funktionieren:

$sb = {
    param($p1,$p2)
    Write-Host "Values are: $p1, $p2"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2

Ich werde das noch einmal überprüfen, wenn ich zur Arbeit komme.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top