2012-10-16 158 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