Powershell - как предварительно оценить переменные в scriptblock для Start-Job

Я хочу использовать фоновые задания в PowerShell.

Как сделать переменные оцененными в момент определения 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

Я получаю напечатанные пустые значения $v1 и $v2. Как я могу их оценить в (передать) scriptblock и так в фоновое задание?

4 ответов


один из способов-использовать метод [scriptblock]:: create для создания блока скрипта из расширяемой строки с использованием локальных переменных:

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

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

$job = Start-Job -ScriptBlock $sb

другой метод-установить переменные в InitializationScript:

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

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

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

третий вариант-использовать параметр-Argumentlist:

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

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

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

самое простое решение (для которого требуется V3 или больше) выглядит следующим образом:

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

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

$job = Start-Job -ScriptBlock $sb

вы можете думать о $using как работающем примерно как явный блок param() и передача-ArgumentList, только PowerShell обрабатывает это автоматически.


объявите значения в качестве параметров в блоке скрипта, затем передайте их с помощью -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

Я не на компьютере проверять, но это должно работать:

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

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

Я проверю это дважды, когда приду на работу.