Domanda

Voglio usare lavori di fondo in PowerShell.

Come rendere le variabili valutate al momento della definizione di scriptblock?

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

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

$job = Start-Job -ScriptBlock $sb

$job | Wait-Job | Receive-Job

$job | Remove-Job

Ricevo valori vuoti stampati di $ V1 e $ V2. Come posso farli valutare (passati a) Scriptblock e quindi al lavoro di fondo?

È stato utile?

Soluzione

Un modo è utilizzare il metodo [ScriptBlock] :: Crea per creare il blocco di script da una stringa espansabile usando le variabili locali:

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

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

$job = Start-Job -ScriptBlock $sb

Un altro metodo è impostare le variabili nelle inizializzazioni:

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

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

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

Una terza opzione è quella di utilizzare il parametro -ArgumentList:

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

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

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

Altri suggerimenti

La soluzione più semplice (che richiede V3 o più) sembra questa:

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

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

$job = Start-Job -ScriptBlock $sb

Puoi pensare a $ che usa come funzionare approssimativamente come un blocco param () esplicito e la lista di argomenti, solo PowerShell lo gestisce automaticamente per te.

Dichiarare i valori come parametri nel blocco di script, quindi trasmetterli nell'uso -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

Non sono al computer per convalidare, ma questo dovrebbe funzionare:

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

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

Controllerò due volte quando entrerò al lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top