Как заметил @ PetSerAl Я указал неверный код. Вот что на самом деле исполняется:
// extract results and handle them
Collection<PSStreamObject> results = ReadAll<PSStreamObject>(job.Results);
if (_wait)
{
foreach (var psStreamObject in results)
{
psStreamObject.WriteStreamObject(this, job.Results.SourceId);
}
}
else
{
foreach (var psStreamObject in results)
{
psStreamObject.WriteStreamObject(this);
}
}
К сожалению Results
является внутренней собственностью. Я исследовал, как это работает, и ниже код:
$nonPublicInstance = [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Instance
$JobResultsProperty = $job.GetType().GetProperty('Results', $nonPublicInstance)
$results = $JobResultsProperty.GetValue($job.ChildJobs[0])
$PSStreamObjectValueProperty = [System.Management.Automation.Remoting.Internal.PSStreamObject].GetProperty('Value', $nonPublicInstance)
foreach ($result in $results)
{
$value = $PSStreamObjectValueProperty.GetValue($result)
switch ($result.ObjectType)
{
'Verbose' {
Write-Output "Verbose Record: $value"
}
'Information' {
Write-Output "Information Record: $value"
}
'WarningRecord' {
Write-Output "Warning Record: $value"
}
'MethodExecutor' {
Write-Output "MethodExecutor"
}
}
}
По какой-то причине ObjectType=Verbose
нет в коллекции. Я предполагаю, что подробные записи каким-то образом извлекаются из MethodExecutor
записей. Выход:
MethodExecutor
Warning Record: warning1
MethodExecutor
Information Record: information1
MethodExecutor
Warning Record: warning2
MethodExecutor
Information Record: information2
MethodExecutor
MethodExecutor
Information Record: information3
MethodExecutor
Я нахожу лучший способ получения результатов от работы, однако он будет работать только с вновь созданными работами. Код ниже добавляет обработчик события DataAdded
в коллекции:
$job = Start-Job -ScriptBlock $sb
$records = New-Object 'System.Collections.Generic.List[System.String]'
Register-ObjectEvent -InputObject $job.ChildJobs[0].Verbose -EventName 'DataAdded' -Action { $records.Add('verbose: ' + $Sender[$EventArgs.Index]) }.GetNewClosure() | Out-Null
Register-ObjectEvent -InputObject $job.ChildJobs[0].Information -EventName 'DataAdded' -Action { $records.Add('information: ' + $Sender[$EventArgs.Index]) }.GetNewClosure() | Out-Null
Register-ObjectEvent -InputObject $job.ChildJobs[0].Warning -EventName 'DataAdded' -Action { $records.Add('warning: ' + $Sender[$EventArgs.Index]) }.GetNewClosure() | Out-Null
Wait-Job $job | Out-Null
$records | Format-List
Выход:
warning: warning1
information: information1
warning: warning2
information: information2
verbose: verbose1
information: information3