2012-10-16 215 views
2

我想從我的C#程序運行命令行。爲了保持簡單,我所做的只是運行「dir」命令。然後我讀取結果的每一行。當我到達輸出結束時程序掛起。它什麼都不做。以下是該計劃。從C#運行命令行process.StandardOutput.ReadLine()掛起

static void Main(string[] args) 
    { 
     ProcessStartInfo startInfo = new ProcessStartInfo("Cmd.exe"); 

     startInfo.UseShellExecute = false; 
     startInfo.RedirectStandardInput = true; 
     startInfo.RedirectStandardOutput = true; 

     Process process = new Process(); 
     process.StartInfo = startInfo; 
     process.Start(); 

     List<string> output = new List<string>(); 

     process.StandardInput.WriteLine("dir"); 
     process.StandardInput.Flush(); 

     while (process.StandardOutput.ReadLine() != null) 
     { 

      output.Add(process.StandardOutput.ReadLine()); 

     } 
     process.WaitForExit(); 
     process.Kill(); 
    } 
+0

如果你只是想枚舉文件夾中的文件,有更好的方法來做到這一點。 – Nasreddine

+0

這段代碼沒有多少意義,你當然想要使用DirectoryInfo類。通常,使用/ c命令行選項讓cmd.exe執行單個命令並退出。 –

回答

3

Cmd.exe不退出,直到你告訴它 - 你等待它完成,但它在等待你的下一個命令。

嘗試process.StandardInput.WriteLine("exit");告訴過程退出。

+1

另外值得注意的是,在你等待進程退出之後,你不需要調用'process.Kill'​​ *。 –

+1

另外,每次迭代都會消耗兩行輸出,但只使用一行。我建議把你想要執行的命令加入到'startInfo.Arguments'中,從而有一個終止過程,而不是讓'cmd.exe' shell運行,並且必須寫入'「exit」到它的標準輸入,然後使用'process.StandardOutput .ReadToEnd()。斯普利特(Environment.NewLine)'。 – DoomMuffins