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


90

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

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

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


13
伟大的第一个问题!
Rotem

2
在最基本的级别上,将调用基于GUI的程序,然后执行返回到提示符。可能是因为外壳程序不希望命令与之交互吗?
shahkalpesh 2014年

Answers:


122

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

如果该应用程序是控制台应用程序,它将在命令提示符下运行,并且您需要等待它完成以使命令提示符返回。

编辑:

好。看来您需要技术说明。如果要在应用程序中模拟相同功能,则可以在此处检查IMAGE_OPTIONAL_HEADEREXE文件。

在内部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. 保存

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


2
@SudhakarTillapudi,欢迎您,我更新了更多详细信息,希望它能解释更多。
72DFBF5B A0DF5BE9 2014年

3
这真的很有信息,再次感谢您继续给我留情:)
Sudhakar Tillapudi 2014年

8

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

start /w notepad.exe

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

希望这会有所帮助,TW


3

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

因此,命令notepad仅启动记事本应用程序,并留下对应用程序的控制。同时,命令在提示符ipconfig的域(不是应用程序域)下运行。

概括地说,当您使用Process.Start等效的C#时,请不要等待。无论如何它不会。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.