コマンドプロンプトは、終了を待機するタイミングをどのようにして知るのですか?


90

C#でWindowsコマンドプロンプトの再コード化を試みました。コマンドプロンプトが、プロセスが終了するのを待つタイミングと、呼び出されたプロセスが終了するのを待たないタイミングをどのように知るのかと思っていました。

たとえば、コマンドプロンプトで「notepad」と入力すると、メモ帳が起動しますが、他のコマンドは実行できます。ただし、more.com、ping.exe、または別のユーティリティなどのユーティリティを開くと、実行中のプログラムが完了するのを待ってから、別のコマンドを実行できます。

コマンドプロンプトは、終了を待機するタイミングをどのようにして知るのでしょうか。また、この動作をC#でエミュレートするにはどうすればよいのでしょうか。


13
素晴らしい最初の質問です!
Rotem 2014年

2
非常に基本的なレベルでは、GUIベースのプログラムが呼び出され、実行はプロンプトに戻ります。シェルがコマンドがそれと対話することを期待していないことが原因である可能性がありますか?
shahkalpesh 2014年

回答:


122

アプリケーションがWin32 GUIアプリケーションの場合、それは実行されるだけで、コマンドプロンプトは終了するのを待ちません。

アプリケーションがコンソールアプリケーションの場合は、コマンドプロンプトで実行されます。コマンドプロンプトに戻るには、アプリケーションが完了するまで待つ必要があります。

編集:

OK。技術的な説明が必要なようです。アプリケーションで同じ機能をエミュレートする場合は、ここIMAGE_OPTIONAL_HEADERでEXEファイルを確認できます

内部には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. コピーしたcalc.exeをCFF Explorerで開きます

  4. Ntヘッダーに移動->オプションのヘッダー

  5. サブシステムを0x002から0x003に変更する

  6. それを保存

ここで、新しく変更された計算を実行すると、コマンドプロンプトが終了するのを待ちます。


2
@SudhakarTillapudi、どういたしまして。詳細を記載して回答を更新しました。
72DFBF5B A0DF5BE9 2014年

3
本当に有益です、remaindig meに感謝します:)
Sudhakar Tillapudi 14年

8

コマンドプロンプトのデフォルトでは、GUIプログラムを別のプロセス/フォークに生成します。ただし、コマンドプロンプト/シェルスクリプトを使用してインラインでメモ帳(または他のGUIプログラム)を実行できます。

start /w notepad.exe

このように、コマンドプロンプト/シェルスクリプトは、notepad.exeプロセスが終了した後にのみ続行されます。

これが役立つことを願って、TW


3

新しいプロセスを開始すると、実際にはプロンプトの境界外で機能するこのコンテキストのGUIアプリケーションは、プロンプトを待機しません。ただし、プロンプトの現在のインスタンスの境界の下で完全に機能するコマンドを実行すると、コマンドは待機します。

したがって、コマンドnotepadはメモ帳アプリケーションを起動し、アプリケーションの制御を残します。一方、コマンドはプロンプトのipconfigドメイン(アプリケーションドメインではありません)で実行されます。

非常に一般化するためProcess.Startに、C#で使用する場合は、待つ必要はありません。とにかくそれはしません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.