代码之家  ›  专栏  ›  技术社区  ›  sheldonzy

使用RSJobs运行多个不同的脚本块

  •  1
  • sheldonzy  · 技术社区  · 6 年前

    我有多个不同的脚本块要运行 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 开始新的工作,因为这是造物主所说的:

    注意,在使用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
    

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Lee_Dailey    6 年前

    据我所知,您需要将对RSJob cmdlet的调用包含在 ForEach-Object 打电话来。看来 Start-RSJob 没有 直接地 通过管道接受脚本块。这个 Start-Job cmdlet有这个限制。