【问题标题】:cmd process don't end in c# programcmd进程不会在c#程序中结束
【发布时间】:2017-03-07 10:09:15
【问题描述】:

我在下面编写此代码以在我的程序中运行 .exe 文件,它的工作正常,只是进程永远不会结束,因此程序不会在 proc.WaitForExit(); 行之后继续。我试图阅读StandartInput,但没有任何改变。可能是什么原因?

我的代码:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.WorkingDirectory = @"D:\";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.RedirectStandardInput = true;
proc.Start();
proc.StandardInput.WriteLine("cd " + directory);
proc.StandardInput.WriteLine(exeFile + arguments);
proc.WaitForExit();`

注意:如果我在 windows 中通过 cmd 运行 exe 文件,它的效果很好。

谢谢。

【问题讨论】:

  • 尝试使用WaitForExit(int milliseconds)方法重载,即prod.WaitForExit(1000);
  • 另外,检查this question
  • 我不喜欢使用WaitForExit(int miliseconds),因为我不知道这个过程需要多长时间,这可能会导致一些问题/工作缓慢。
  • 你基本上打开cmd而不关闭它,使用proc.WaitForExit()你只需等到用户关闭cmd。注意proc.StartInfo.CreateNoWindow = true;只是没有打开控制台而是运行了一个cmd进程,所以需要显式停止该进程。
  • 但是我怎么知道什么时候关闭窗口呢?我尝试使用 StandardOutput.ReadToEnd() 但这没有帮助 - 可能是因为 exe 文件不写任何输出/

标签: c# cmd process


【解决方案1】:

让我们看看你的代码,看看进程运行的原因:

1.) 你创建一个进程

 System.Diagnostics.Process proc = new System.Diagnostics.Process();

2.) 你初始化它:

 proc.StartInfo.FileName = "cmd.exe";
 proc.StartInfo.WorkingDirectory = @"D:\";
 proc.StartInfo.UseShellExecute = false;
 proc.StartInfo.RedirectStandardOutput = true;
 proc.StartInfo.RedirectStandardInput = true;

这部分确保用户看不到控制台:

 proc.StartInfo.CreateNoWindow = true;  

开始进程:

 proc.Start();

使用cmd进入目录并执行一些exe文件:

 proc.StandardInput.WriteLine("cd " + directory);
 proc.StandardInput.WriteLine(exeFile + arguments);

现在等待进程停止

 proc.WaitForExit();

但它不会因为您没有关闭该进程 - cmd 即使没有可见的控制台仍在运行 - 这就是问题所在。

所以最好使用:

 proc.Close();

在 cmd 中完成所有必要的操作之后。

出现其他问题 - 您应该知道何时停止可执行文件,cmd 不会帮助您。

可以考虑使用不带cmd的进程:

 proc.StartInfo.FileName = "exeFile";
 proc.StartInfo.Arguments = "arguments";
 proc.StartInfo.WorkingDirectory = "directory";
 proc.StartInfo.UseShellExecute = false;
 proc.StartInfo.RedirectStandardOutput = true;
 proc.StartInfo.RedirectStandardInput = true;

现在您可以完全控制正在运行的进程,并知道它何时终止。

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多