2013-04-13 71 views
1

我使用System.Diagnostics.Process,因爲它允許我得到錯誤代碼和相關的錯誤。只重定向stderr,保持標準輸出指向控制檯使用System.Diagnostics.Process

但是,當我設置StartInfo.RedirectStandardOutput = $false輸出沒有回顯到我的控制檯窗口,所以目前我被迫添加額外的by-ref參數$ stdout並從調用函數中回顯它。

這是不理想的,因爲一些命令可能會產生大量的文本,我擔心緩衝區溢出。

任何方式,我仍然可以使用類似的System.Diagnostics.Process代碼,仍然捕獲錯誤字符串,但讓輸出流動到控制檯正常,無需重定向到標準輸出?

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 
} 

回答

2

您可能不需要使用System.Diagnostics.Process對象。只需執行EXE並獲取如下信息:

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