문제

C# 응용 프로그램에서 PowerShell 테스트 스크립트를 실행하고 있습니다. Pipe.invoke ()가 예외를 던지는 CMDLET 불량으로 인해 스크립트가 실패 할 수 있습니다.

예외에 필요한 모든 정보를 캡처 할 수 있지만 그 시점까지 스크립트의 출력을 표시 할 수 있습니다. 예외가 발생하면 결과가 무효 인 것처럼 보이므로 운이 없었습니다.

내가 놓친 것이 있습니까? 감사!

m_Runspace = RunspaceFactory.CreateRunspace();
m_Runspace.Open();
Pipeline pipe = m_Runspace.CreatePipeline();
pipe.Commands.AddScript(File.ReadAllText(ScriptFile));
pipe.Commands.Add("Out-String");
try {
   results = pipe.Invoke();
}
catch (System.Exception)
{
   m_Runspace.Close();
   // How can I get to the Powershell output that comes before the exception?
}
도움이 되었습니까?

해결책 2

내가 사용한 솔루션은 PowerShell의 출력을 처리하기 위해 자체 PSHOST를 구현하는 것이 었습니다. 이에 대한 초기 정보는에서 나왔습니다 http://community.bartdesmet.net/blogs/bart/archive/2008/07/06/windows-powershell-through-ironruby-writing-acustom-pshost.aspx "커스텀 PS 호스트 구축"섹션에서.

제 경우에는 사용자 정의 PshostrawuserInterface를 사용해야했습니다.

다음은 한 일에 대한 빠른 개요입니다. 실제로 명시한 기능 만 나열했지만 새로운 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
}

다른 팁

이것이 도움이되는지 확실하지 않습니다. 나는 당신이 v1을 실행하고 있다고 생각합니다. 이 V2 접근법은 결과를 던지지 않고 결과를 인쇄합니다.

Hello World
67 errors

string script = @"
  'Hello World'
  ps | % {
    $_.name | out-string1
  }
";

PowerShell powerShell = PowerShell.Create();

powerShell.AddScript(script);
var results = powerShell.Invoke();

foreach (var item in results)
{
  Console.WriteLine(item);
}

if (powerShell.Streams.Error.Count > 0)
{
  Console.WriteLine("{0} errors", powerShell.Streams.Error.Count);
}

나도 같은 문제를 안고있어. pipe.invoke ()가 예외를 던질 때 출력을 얻는 가장 쉬운 방법은 사용하는 것입니다. 호출 (ienumerable 입력, Ilist 출력)

예제는 올바른 순서로 모든 출력, 오류, 쇠퇴 등을 얻는 방법을 보여줍니다.

PowerShell 스크립트

Write-Output "Hello world" 
Write-Error "Some error"
Write-Warning "Some warning"
throw "Some exception"

씨#

List<string> RunLog = new List<string>(); 

using (System.Management.Automation.PowerShell psInstance = System.Management.Automation.PowerShell.Create())

{
    psInstance.AddScript(_Script);

psInstance.Streams.Error.DataAdded += (sender, args) =>
{
    ErrorRecord err = ((PSDataCollection<ErrorRecord>)sender)[args.Index];
    RunLog.Add($"ERROR: {err}");
};

psInstance.Streams.Warning.DataAdded += (sender, args) =>
{
    WarningRecord warning = ((PSDataCollection<WarningRecord>)sender)[args.Index];
    RunLog.Add($"WARNING: {warning}");
};

... etc ...

var result = new PSDataCollection<PSObject>();
result.DataAdded += (sender, args) =>
{
    PSObject output = ((PSDataCollection<PSObject>)sender)[args.Index];
    RunLog.Add($"OUTPUT: {output}");
};

try
{
    psInstance.Invoke(null, result);
}
catch(Exception ex)
{
    RunLog.Add($"EXCEPTION: {ex.Message}");
}                                                
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top