2016-10-25 4 views
-1

cmdでコマンドを実行するためにCreateprocessを使用していますが、GetExitCodeProcess()を使用してその特定のコマンド実行の終了コードを取得しようとしています。Windowsでcmdを実行した後に終了コードを取得する方法C++

コマンドウィンドウが開いていて、GetExitCodeProcess()を試してみると、259(STILL_ACTIVE)の戻りコードが常に得られます。 TerminateProcess()を使用してプロセスを終了しようとすると、プロセスを終了するために送信した値が終了コードになります。以下は

は私のコードです:

STARTUPINFO si; 
    ZeroMemory(&si,sizeof(STARTUPINFO)); 
    si.cb = sizeof(si); 

    PROCESS_INFORMATION pi; 
    ZeroMemory(&pi, sizeof(pi)); 

    BOOL b = CreateProcess("C:\\Windows\\System32\\cmd.exe","/k dir",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); 

    TerminateProcess(pi.hProcess,1); 

    DWORD dwExitCode = 0; 
    ::GetExitCodeProcess(pi.hProcess, &dwExitCode); 

i「は/ k個のdirancbdf」(任意のノンイグジストコマンド)を渡した場合、私は、コマンドとゼロのエラーコードとして「/ k個のディレクトリ」を渡すときに私は0以外のエラーコードを取得する必要があります。

Terminateprocessを使用する別の理由は、そのコマンドの成功/失敗に基づいてコマンドプロンプトを非表示にすることです。

ありがとうございます。

+1

[TerminateProcess'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686714(v = vs.85).aspx)は、実際にアプリケーションを終了しようとします。まだ終了していない場合でも、また、*非同期*です!詳細については、リンク先のリファレンスをお読みください。 –

+2

ここでは何を達成しようとしているのかは分かりませんが、 '/ k'ではなく'/c'を使用し、 'CREATE_NEW_CONSOLE'フラグは省略してください。まだコンソールがない場合は、最初にコンソールを作成する必要があります。 –

+0

@Someprogrammerdudeはい、私はそれを知っています。 TerminateProcessを使用せずに終了コードを取得しようとすると、私はいつも259(STILL_ACTIVE)を取得します。それに代わるものは何ですか? –

答えて

1

/kcmd.exeに渡しています。つまり、コマンドdirの実行後にシェルをアクティブにしておきたいということです。このようにすると、コマンドを実行しているプロセスが終了することはなく、GetExitCodeProcess()(プロセスがまだ実行中であることを意味する)クエリを実行すると、常にSTILL_ACTIVEになります。

あなたがdirコマンドの終了コードが必要な場合(cmd.exeコマンドdirをexecutig後に終了するように)、あなたの代わりにオプション/cを使用する必要があります。さらに、プロセスの作成直後(プロセスが終了するのを待つことはありません)にCreateProcess()が返されるので、GetExitCodeProcess()を照会する前に、WaitForSingleObject()を使用してプロセスが終了するのを待つ必要があります。この場合はTerminateProcess()に電話する必要はありません。dirコマンドの返品ステータスはGetExitCodeProcess()から利用可能になります。

BOOL b = CreateProcess("C:\\Windows\\System32\\cmd.exe","/c dir",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); 
WaitForSingleObject(pi.hProcess, INFINITE); // wait for process to end 
DWORD dwExitCode = 0; 
::GetExitCodeProcess(pi.hProcess, &dwExitCode); 

エラーが発生した場合、コンソールは開いたままにしたい場合は、次の構文を使用することができます。

||pauseコマンドは dirコマンドが失敗した場合にのみ実行されることを保証
CreateProcessA("C:\\Windows\\System32\\cmd.exe","/c dir || pause && exit 1",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); 

、および&&は、このようなエラーが発生した場合に終了コード1が出力されるようにします。

+0

私は/ kの代わりに/ cを使用しましたが、 "/ c dir"の終了コードは0、 "/ c dirabc"の終了コードは1つ残っています(間違ったコマンド)。私はGetExitCodeProcessのドキュメントごとに成功するためには0以外の値を得なければならないと思います。 –

+0

いいえ、規約は、終了コードゼロが成功を示し、ゼロ以外の終了コードが失敗を示していることです。これは規則ではなく規則であり、プログラマーの気まぐれに左右されます。 ( 'robocopy'の場合、例えば4より小さい終了コードは成功を示します。) –

+0

@shrikeありがとう。 WaitForSingleObjectも使用しましたが、これと同じ終了コードがあります。 –

関連する問題