Pregunta

Quiero usar trabajos de fondo en PowerShell.

¿Cómo hacer variables evaluadas en el momento de la definición 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

Me imprimen valores vacíos de $ V1 y $ V2. ¿Cómo puedo evaluarlos en (pasar) el scriptblock y así para el trabajo de fondo?

¿Fue útil?

Solución

Una forma es usar el método [scriptBlock] :: Crear para crear el bloque de script a partir de una cadena expanable usando variables locales:

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

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

$job = Start-Job -ScriptBlock $sb

Otro método es establecer variables en InitializationScript:

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

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

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

Una tercera opción es usar el parámetro -argumentList:

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

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

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

Otros consejos

La solución más simple (que requiere V3 o mayor) se ve así:

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

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

$job = Start-Job -ScriptBlock $sb

Puede pensar en $ usando que funciona más o menos como un bloque explícito param () y pasando -argumentList, solo PowerShell maneja eso para usted automáticamente.

Declarar los valores como parámetros en el bloque de script, luego pasarlos usando -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

No estoy en una computadora para validar, pero esto debería funcionar:

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

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

Revisaré esto cuando me mete en el trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top