仅重定向stderr,使用System.Diagnostics.Process将stdout指向控制台

时间:2013-04-13 19:54:01

标签: powershell

我正在使用System.Diagnostics.Process,因为它允许我获取错误代码和相关错误。

但是,当我设置StartInfo.RedirectStandardOutput = $false输出没有回显到我的控制台窗口时,所以目前我被迫添加一个额外的by-ref参数$ stdout并从调用函数回显它。

这不太理想,因为某些命令可能会生成大量文本,我担心缓冲区溢出。

我仍然可以使用下面类似的System.Diagnostics.Process代码的任何方式仍然将错误捕获到字符串,但是让输出流正常到控制台而不重定向到stdout?

function Run([string] $runCommand,[string] $runArguments,[ref] [string] $stderr)
{
    $p = New-Object System.Diagnostics.Process
    $p.StartInfo = New-Object System.Diagnostics.ProcessStartInfo;
    $p.StartInfo.FileName = $runCommand
    $p.StartInfo.Arguments = $runArguments
    $p.StartInfo.CreateNoWindow = $true
    $p.StartInfo.RedirectStandardError = $true
    $p.StartInfo.RedirectStandardOutput = $false
    $p.StartInfo.UseShellExecute = $false

    $p.Start() | Out-Null
    $p.WaitForExit()

    $code = $p.ExitCode
    $stderr.value = $p.StandardError.ReadToEnd()

    # what I have been doing is using a stdout by-ref variable and echoing out contents
    # $stdout.value = $p.StandardOutput.ReadToEnd()

    return $code
}

1 个答案:

答案 0 :(得分:2)

您可能不需要使用System.Diagnostics.Process对象。只需执行EXE并获取如下信息:

$stdout = .\foo.exe 2> fooerr.txt
Get-Content fooerr.txt
return $LastExitCode