У меня есть несколько разных блоков сценариев, которые я хочу запустить с помощью Start-RSJob
из модуля PoshRSJob.
У меня есть следующий код:
$SB1 = {Write-Output "Hello from 1"}
$SB2 = {Write-Output "Hello from 2"}
$SB3 = {Write-Output "Hello from 3"}
$SB4 = {Write-Output "Hello from 4"}
$SBs = @($SB1, $SB2, $SB3, $SB4)
$SBs | Start-RSJob -ScriptBlock {
$PSBoundParameters.GetEnumerator() | ForEach {
. $_.Value
}
}
Get-RSJob | Wait-RSJob
который работает, но я иногда получаю (иногда без ошибок, иногда с ошибками) ошибки внутри заданий, например, для задания, которое выполнило $SB3
:
Stack empty. Hello from 3
И из задания, которое выполнило $SB4
:
Stack empty. Hello from 4
И от двух других заданий я получил ожидаемый результат:
Hello from 1 Hello from 2
Я не использую ForEach
для запуска новых заданий, потому что так сказал создатель:
Обратите внимание, что я не использую ForEach при использовании Start-RSJob. Это требует входных данных непосредственно из конвейера для правильной работы и полного использования возможностей регулирования.
Редактировать:
Итак, работает следующее:
$SB1 = {Write-Output "Hello from 1"}
$SB2 = {Write-Output "Hello from 2"}
$SB3 = {Write-Output "Hello from 3"}
$SB4 = {Write-Output "Hello from 4"}
$SBs = @($SB1, $SB2, $SB3, $SB4)
Get-RSJob | Remove-RSJob
$SBs |Start-RSJob -ScriptBlock {
$PSBoundParameters.GetEnumerator() | ForEach {
$SB_run = [ScriptBlock]::Create($_.Value)
$SB_run.Invoke()
}
}
Get-RSJob | Wait-RSJob | Receive-RSJob
Но я понятия не имею, почему предыдущий не сделал.