如何隐藏cmd窗口,关闭它并等待自动执行

时间:2015-11-23 08:53:36

标签: c# batch-file pdf cmd

执行bat文件后,命令行窗口出现问题。我想运行bat文件,没有显示cmd窗口,关闭它,然后打开我的PDF文件,这是使用我的程序和bat文件生成的。我的代码:

if (isset($perguntas) && is_array($perguntas)){

所以在我的情况下会发生什么:一切都按照应有的方式运行,但我的PDF是在我的bat文件执行之前显示的。如何让我的 Process p1 = new Process(); p1.StartInfo.FileName = @"C:\dir\batch.bat"; p1.StartInfo.Arguments = @"C: \dir\final.tex"; p1.StartInfo.UseShellExecute = false; p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p1.Start(); p1.WaitForExit(15*1000); p1.Close(); Process.Start(@"C:\dir\final.pdf"); 等待,直到我的bat文件完成这项工作?使用Process.Start(pdf)时,我需要手动退出cmd窗口,我不想这样做。有什么想法吗?

感谢。

我的蝙蝠档案:

p1.WaitForExit()

1 个答案:

答案 0 :(得分:1)

您正在寻找这个:

        p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

请注意,MSDN表示

  

要使用ProcessWindowStyle.Hidden,ProcessStartInfo.UseShellExecute属性必须为false。

你在那里,但以防万一...

ProcessStartInfo.CreateNoWindow是另一回事 - 这是关于您的流程窗口是否将托管新流程窗口。默认值为false,这是您想要的,因此不要将其设置为true。即删除

       p1.StartInfo.CreateNoWindow = true;

来自您的代码。您确实希望新进程在自己的窗口中运行,但您希望它是一个隐藏的窗口。然后你只需要等待新进程的终止就完成了。

要等待,您可以使用WaitForExit。但是,我总是建议你不要无限期地等待,但总是考虑一个理智的限制 - 可能是30秒,1分钟,2分钟......取决于你的孩子过程的任务。如果它花了太长时间(子进程可能被窃听并且只是因为未知原因而挂起)那么就把它杀掉。

更新(使用WaitForExit):

以下内容将等待最多60秒以完成子进程:

      if (p1.WaitForExit(60 * 1000))
      {
        // Child process finished, do whatever you want
      }
      else 
      {
        // Child process failed to finish within 60 seconds, so we kill it.
        // It is unlikely that there is a result you are expecting ...
        p1.Kill();
      }