1

我想Start-RSJobPoshRSJob模块运行多个不同的脚本块。

我有以下代码:

$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

堆空。
你好从3

从执行的工作中$SB4

堆空。
你好从4

从另外两个工作中,我得到了预期的输出:

你好从1
你好从2

我没有使用ForEach来开始新工作,因为这是创建者所说的:

请注意,我在使用 Start-RSJob 时不使用 ForEach。这直接从管道获取输入以正常工作并充分利用节流功能。

编辑:

所以以下工作:

$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

但我不知道为什么前一个没有。

4

1 回答 1

0

据我所知,您需要将对 RSJob cmdlet 的调用包含在ForEach-Object调用中。似乎Start-RSJob直接通过管道接受脚本块。cmdlet 有这个Start-Job限制。

于 2018-12-02T17:15:08.583 回答