Получите выходные данные о работе ребенка
Если вы запускаете задание (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 ответ
ChildJobs используются для удаленных заданий. Если вы используете, например, Invoke-Command -ScriptBlock { ... } -AsJob -ComputerName YourRemoteComputer
Вы получаете удаленную работу (ChildJob) и локальную работу, которая обрабатывает удаленную работу.
У вас есть Job-Object из start-Job
, если ваша первая работа возвращает этот объект, вы можете получить его и прочитать вывод