Question

Je veux utiliser des travaux de fond dans PowerShell.

Comment faire des variables évaluées au moment de la définition de 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

Je reçois des valeurs vides imprimées de $ v1 et $ v2. Comment puis-je les faire évaluer (transmis à) le Scriptblock et ainsi pour le travail d'arrière-plan?

Était-ce utile?

La solution

Une façon consiste à utiliser la méthode [scriptblock] :: Créer pour créer le bloc de script à partir d'une chaîne étendue en utilisant des variables locales:

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

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

$job = Start-Job -ScriptBlock $sb

Une autre méthode consiste à définir des variables dans le InitializeScript:

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

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

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

Une troisième option consiste à utiliser le paramètre -argumentList:

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

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

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

Autres conseils

La solution la plus simple (qui nécessite V3 ou plus) ressemble à ceci:

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

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

$job = Start-Job -ScriptBlock $sb

Vous pouvez considérer $ en utilisant comme travaillant à peu près comme un bloc param () explicite et en passant-argumentList, seul PowerShell le gère automatiquement pour vous.

Déclarez les valeurs sous forme de paramètres dans le bloc de script, puis passez-les en utilisant -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

Je ne suis pas dans un ordinateur pour valider, mais cela devrait fonctionner:

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

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

Je vais vérifier ceci lorsque je me lèverai au travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top