命令提示符如何知道何时等待退出?

时间:2014-03-08 19:09:39

标签: c# windows command-prompt

我试图在C#中执行Windows命令提示符重新编码。我想知道命令提示符如何知道何时等待进程开始退出,以及何时不等待被调用进程退出。

例如,如果您在命令提示符下键入“notepad”,Notepad将启动,但您仍然可以执行其他命令。但是,如果您打开诸如more.com,ping.exe或其他实用程序之类的实用程序,它将等待执行程序完成,然后再让您执行另一个命令。

命令提示符如何知道何时等待退出,以及如何在C#中模拟此行为?

3 个答案:

答案 0 :(得分:123)

如果应用程序是Win32 GUI应用程序,它将只运行,命令提示符不会等待它退出。

如果应用程序是控制台应用程序,它将在命令提示符下运行,您需要等待它完成以获取命令提示符。

修改

行。看来你需要技术解释。如果您想在应用程序中模拟相同的功能,可以查看IMAGE_OPTIONAL_HEADER EXE文件here

IMAGE_OPTIONAL_HEADER内,有:

 WORD                 Subsystem;

If SubSystem == 0x02这意味着它是一个GUI应用程序。

If SubSystem == 0x03这意味着它是一个命令提示符应用程序。

编辑2:

如果你想看到它的实际效果:

  1. 下载http://www.ntcore.com/exsuite.php

  2. 将calc.exe或notepad.exe复制到桌面

  3. 在CFF资源管理器中打开复制的calc.exe

  4. 导航到Nt标题 - >可选标题

  5. 将子系统从0x002更改为0x003

  6. 保存

  7. 现在运行新修改的calc,您将看到命令提示符等待它终止。

答案 1 :(得分:7)

命令提示符的默认设置是在单独的进程/分支中生成GUI程序。 但是,您可以使用命令提示符/ shell脚本内联运行记事本(或其他GUI程序):

start /w notepad.exe

这样,命令提示符/ shell脚本仅在notepad.exe进程终止后才会继续。

希望这有帮助,TW

答案 2 :(得分:3)

当您启动新进程时,此上下文中的GUI应用程序实际上在提示边界之外工作,提示将不会等待。但是,如果您运行的命令完全在当前提示实例的边界下工作,则它会等待。

因此,命令notepad只启动记事本应用程序并保留对应用程序的控制权。虽然,命令ipconfig在提示符的域(不是application domain)下运行。

要非常概括,当您在C#中使用Process.Start时,请不要等待。无论如何它不会。