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
}