Получить вывод дочернего задания дочернего задания

Если вы запускаете задание (A), а это задание, в свою очередь, запускает другое задание (B), можно ли получить результат (B), используя что-то подобное?

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

Я надеялся, что смогу рекурсивно углубиться в объект, но любопытно, что (Get-Job -Name A).ChildJobs[0] всегда имеет пустую коллекцию ChildJobs. Это может быть просто непонимание с моей стороны того, как создаются рабочие места.

Одним из обходных путей является ожидание завершения задания B, получение его вывода, сохранение его в переменной и выполнение Write-Output для переменной, чтобы родительский сценарий мог ее обработать. Это работает, но это означает, что мне нужно дождаться завершения задания 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 *

person Patrick Alexson    schedule 01.09.2015    source источник


Ответы (1)


ChildJobs используются для удаленных заданий. Если вы используете, например, Invoke-Command -ScriptBlock { ... } -AsJob -ComputerName YourRemoteComputer, вы получаете удаленное задание (ChildJob) и локальное задание, которое обрабатывает удаленное задание.

У вас есть Job-Object от start-Job. если ваше первое задание возвращает этот объект, вы можете получить его и прочитать вывод

person egolus    schedule 01.09.2015