2013-11-15 21 views
0

我在執行一個像「del * .txt」這樣的'txt'文件被打開並且不能被刪除的cmd進程時看到的具體問題,cmd進程將輸出一行文本'文件正在使用,無法刪除文件')到控制檯,但不是StandardOutput或StandardError。根據2008年的這個問題[https://stackoverflow.com/a/320779/832705],答案是否定的,但我想知道這是否可能在過去的4年中發生了變化,或者如果有人已經找到了解決方法。另外,我可能會誤解這個答案,這可能意味着CLR異常而不是cmd異常。有沒有C#的方式來讀取cmd進程的異常?

這裏是我的過程安裝/啓動代碼:

ProcessStartInfo psi = new ProcessStartInfo("cmd", string.Empty); 
psi.CreateNoWindow = true; 
psi.ErrorDialog = false; 
psi.RedirectStandardError = true; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardInput = true; 
psi.UseShellExecute = false; 
Process p = new Process(); 
p.StartInfo = psi; 
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 
p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived); 
outputfilesw = new StreamWriter(outputfile, true); 
try 
{ 
    p.Start(); 
    p.BeginOutputReadLine(); 
    //work code 
} 
+1

我的印象是你不得不調用p.BeginErrorReadLine()來捕獲任何輸出到StandardError流。我可能是錯的。自從我在System.Diagnostics中修改以來已經有一段時間了。 – trope

+0

@trope:是的,就是這樣。真的很簡單。你應該把它放在一個答案 – stackuser83

回答

2

您只需調用p.BeginErrorReadLine()即可啓動StandardError的異步讀取。在OP的建議下增加了答案。

0

可以讀取輸出,並且可以處理文本返回。所以,即使它沒有出現在錯誤輸出中,您也應該能夠找到指示錯誤的文本。

此外,重要的是要注意,只有正在運行的進程可以確定哪個輸出流獲取消息。因此,如果您使用的命令決定將錯誤發送到標準流,則不會有任何操作系統或C#工作會改變這一點。

相關問題