Author Posts

April 25, 2014 at 10:36 am

Hello,

Response from Receive-Job contains some errors and I want to capture those in variable for some reason those are missing from variable but do output to screen when required. Example is below. I'd like $resp variable to contain error message as well, not only "Server1 processing finished"

PS C:\Users\admin>> $Sender | Receive-Job -Keep
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
+ PSComputerName : localhost

Server1 Processing finished

PS C:\Users\admin>> $resp = ($Sender | Receive-Job -Keep)
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
+ PSComputerName : localhost

PS C:\Users\admin>> $resp
Server1 Processing finished

April 25, 2014 at 10:41 am

use Get-Job to get the job object, and pipe it to Get-Member. You should see properties of the job object that provide access to the various pipelines.

Keep in mind that in PowerShell, error messages are never part of the "main" output – and Remoting only captures the "main" output. Errors, warnings, and so on have their own pipelines, or channels. They're not always capturable with Remoting.

April 25, 2014 at 10:57 am

Thanks.
For anybody having the same issue following will capture error stream as well

($Sender | Receive-Job 2>&1)

April 25, 2014 at 11:03 am

And just to clarify what that's doing: It's taking the error pipeline (#2) and redirecting it into the main output pipeline (#1), mingling the two.

April 25, 2014 at 1:34 pm

ErrorVariable and ErrorAction seem to work with Receive-Job just like any other cmdlet (though this test was running a local job, not remote. I don't have another computer up on my home network at the moment for a full test.)

$job = Start-Job -ScriptBlock { Write-Error "This is an error."; Write-Output "This is output." }
$null = $job | Wait-Job
$output = $job | Receive-Job -Keep -ErrorAction SilentlyContinue -ErrorVariable remoteErrors

$remoteErrors.Count
$remoteErrors[0]

April 25, 2014 at 1:52 pm

For some reason does not work for me

PS C:\Users\admin>> Receive-Job 661 -Keep -ErrorVariable $RemoteErr
The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
+ PSComputerName : localhost

Server1 finished

PS C:\Users\gsuvalian>> $RemoteErr -eq $null
True

April 27, 2014 at 3:03 pm

You should remove the '$' character from the '-ErrorVariable' parameter. Your code should probably be:

Receive-Job -ID 661 -Keep -ErrorVariable RemoteErr
$RemoteErr -eq $null

You can read more about it if you run

Get-Help about_CommonParameters