Powershell - как предварительно оценить переменные в скриптблоке для 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. Как я могу их оценить в (переданном) скриптблоку и, таким образом, в фоновое задание?
Ответы
Ответ 1
Один из способов - использовать метод [scriptblock]:: create для создания блока script из расширяемой строки с использованием локальных переменных:
$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
Ответ 2
Простейшее решение (требующее V3 или выше) выглядит следующим образом:
$v1 = "123"
$v2 = "asdf"
$sb = {
Write-Host "Values are: $using:v1, $using:v2"
}
$job = Start-Job -ScriptBlock $sb
Вы можете думать о том, что $using работает примерно как явный блок param() и передает -ArgumentList, только PowerShell автоматически обрабатывает это для вас.
Ответ 3
Объявите значения как параметры в блоке script, затем передайте их с помощью -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
Ответ 4
Я не на компьютере для проверки, но это должно работать:
$sb = {
param($p1,$p2)
Write-Host "Values are: $p1, $p2"
}
$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2
Я дважды проверю это, когда буду работать.