获得孩子的工作机会

时间:2015-09-01 15:32:57

标签: powershell start-job

如果你开始一个工作(A)而这个工作反过来又开始另一个工作(B),是否可以通过使用这样的东西获取(B)的输出?

(Get-Job -Name A).ChildJobs[0].ChildJobs[0]...

我希望我可以递归地深入到对象中,但奇怪的是(Get-Job -Name A).ChildJobs[0]总是有一个空的ChildJobs集合。这可能只是我对如何创造就业机会的误解。

一种解决方法是等到作业B完成,获取其输出,将其存储在变量中,然后对变量执行写入输出,以便父脚本可以处理它。它有效,但这意味着我必须等到作业B结束,这可能需要10-40分钟。

我可能(在作业B中)立即写入输出,因为它发生在平面文件或SQLite数据库中,但我希望我可以从脚本的最顶层范围内获取它。

这是一个例子

    Get-Job | Remove-Job

$ErrorActionPreference = "stop"

$Level1Job = {
    $Level2Job = {
        $Level3Job = {
            Write-Output "Level 3, start"

            Start-Sleep -s 5

            Write-Output "Level 3, end"
        }

        Write-Output "Level 2, start"

        # start the third job...
        Start-Job -ScriptBlock $Level3Job -Name "level 3"

        # wait for the job to complete
        while(get-job | where-object { ($_.State -ne "completed") -and ($_.State -ne "failed") }){ Start-Sleep -s 2 }

        Start-Sleep -s 5

        Write-Output "Level 2, end"
    }

    Write-Output "Level 1, start"

    # start the second job on the remote computer...
    Start-Job -ScriptBlock $Level2Job -Name "level 2"

    # wait for the job to complete
    while(get-job | where-object { ($_.State -ne "completed") -and ($_.State -ne "failed") }){ Start-Sleep -s 2 }

    Start-Sleep -s 5

    Write-Output "Level 1, end"
}

# start the first job...
Start-Job -ScriptBlock $Level1Job -Name "level 1"

# wait for the job to complete
while(get-job | where-object { ($_.State -ne "completed") -and ($_.State -ne "failed") }){ Start-Sleep -s 2 }

Start-Sleep –s 5


(get-job)[0].ChildJobs[0] | fl *

1 个答案:

答案 0 :(得分:0)

ChildJobs用于远程作业。如果您使用例如Invoke-Command -ScriptBlock { ... } -AsJob -ComputerName YourRemoteComputer,则会获得远程作业(ChildJob)和处理远程作业的本地作业。

您拥有来自start-Job的作业对象。如果您的第一个作业返回此对象,您可以接收它并阅读输出