Nick A Nick A - 27 days ago 7
C# Question

Capturing Powershell output in C# after Pipeline.Invoke throws

I'm running a Powershell test script from a C# application. The script can fail due to a bad cmdlet which causes pipe.Invoke() to throw an exception.

I'm able to capture all the information I need about the exception, but I'd like to be able to display the script's output up to that point. I haven't had any luck since results appears to be null when an exception is thrown.

Is there something I'm missing? Thanks!

m_Runspace = RunspaceFactory.CreateRunspace();
Pipeline pipe = m_Runspace.CreatePipeline();
try {
results = pipe.Invoke();
catch (System.Exception)
// How can I get to the Powershell output that comes before the exception?

Answer Source

The solution I ended up using was to implement our own PSHost to handle PowerShell's output. The initial information for this came from in the "Building a custom PS host" section.

In my case it did require using a custom PSHostRawUserInterface as well.

Here's the quick overview of what was done. I've only listed the function I actually implimented, but there's many that are just contain throw new NotImplementedException();

private class myPSHost : PSHost
   (Same as what the above link mentions)
private class myPSHostUI : PSHostUserInterface
   private myPSHostRawUI rawui = new myPSHostRawUI();

   public override void Write // all variations
   public override PSHostRawUserInterface RawUI { get { return rawui; } }

private class myPSHostRawUI : PSHostRawUserInterface
   public override ConsoleColor ForegroundColor
   public override ConsoleColor BackgroundColor
   public override Size BufferSize