Запуск нескольких разных ScriptBlocks с RSJobs - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть несколько различных блоков сценариев, которые я хочу запустить с 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

Но японятия не имею, почему предыдущий не сделал.

1 Ответ

0 голосов
/ 02 декабря 2018

Из того, что я могу сказать, вам нужно заключить вызов в командлет RSJob в вызов ForEach-Object.кажется, что Start-RSJob не напрямую принимает блок сценариев через конвейер.у Start-Job командлета есть такое ограничение.

...