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

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

例如,如果您键入命令提示符“记事本”, 记事本将启动,但您仍然可以执行其他命令。 但是,如果您打开more.com,ping.exe或其他实用程序等实用程序,则会等待正在执行的程序完成,然后再执行其他命令。

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

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

如果应用程序是一个控制台应用程序,它将在命令提示符下运行,您需要等待它完成才能返回命令提示符。

编辑:

好。 看来你需要技术上的解释。 如果你想在应用程序中模拟相同的function,可以在这里查看EXE文件的IMAGE_OPTIONAL_HEADER

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资源pipe理器中打开复制的calc.exe

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

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

  6. 保存

现在运行新的修改后的calc,你会看到命令提示符等待它被终止。

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

 start /w notepad.exe 

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

希望这有助于TW

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

所以,命令notepad只是启动记事本应用程序,离开了应用程序的控制。 而命令ipconfig运行在一个域下(不是这个不是应用程序域 )的提示符。

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