并不总是在C#中看到来自PowerShell警告流的输出

时间:2015-01-16 15:23:04

标签: c# powershell

我试图通过我的C#应用​​程序在PowerShell中运行以下命令。

PsSession.RunPowerShellScript("Get-Mailboxstatistics -Identity John.Doe");

方法RunPowerShellScript返回输出的连接字符串,如下所示。

public static string RunPowerShellScript(string psScript)
{
    try
    {
        PowerShell ps = PowerShell.Create();
        ps.Runspace = psRunSpace; //Set Statically Elsewhere
        ps.AddScript(psScript);

        Collection<PSObject> results = ps.Invoke();

        if (ps.HadErrors)
        {
            string output = "";
            foreach (ErrorRecord errorRecord in ps.Streams.Error)
                output += errorRecord.Exception.Message.ToString();
            throw new Exception(output);
        }
        else
        {
            if (results.Count != 0)
            {
                string output = "";
                foreach (PSObject result in results)
                    output += result.BaseObject.ToString();
                return output;
            }
            else
            {
                if (ps.Streams.Warning.Count != 0)
                {
                    string output = "";
                    foreach (WarningRecord s in ps.Streams.Warning)
                        output += s.Message.ToString();
                    return output;
                }
                else
                    return "No Results.";
            }
        }
    }
    catch (Exception ex)
    {
        return "Error: " + ex.Message.ToString();
    }
}

问题是当Get-MailboxStatistics cmdlet返回警告时,ps.Streams.Warning.Count仍然等于0(实际上所有 streams.count = 0)。

但是,如果我跑

PsSession.RunPowerShellScript("Write-Warning 'Test'")

然后它会正确地返回警告(&#34;测试&#34;)。

我尝试通过运行此

将警告流重定向到输出流
PsSession.RunPowerShellScript("Get-Mailboxstatistics -Identity John.Doe  *>&1");

但这并没有解决它。

如果我从PowerShell ISE运行cmdlet,我会得到以下内容

PS C:\Windows\system32> Get-Mailboxstatistics -Identity John.Doe
WARNING: The user hasn't logged on to mailbox 'John.Doe'...

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,因此我决定使用-WarningAction Stop,然后解析异常消息。