1

実行に数秒かかる WMIC 経由でリモート CMD ライン コマンドを実行しています。私は現在、先に進む前に Thread.Sleep(4000) を実行しています...もっと良い方法があるはずです! 発行したコマンドが終了したかどうか、またはステータス バイトかどうかを判断するために使用できる変数またはメソッドはありますか?

ありがとう!

次のコードを使用してコマンドを発行します。

ManagementClass processTask = new ManagementClass(@"\\" + this.wmiConnection.machineName + @"\root\CIMV2", "Win32_Process", null);
        ManagementBaseObject methodParams = processTask.GetMethodParameters("Create");
        methodParams["CommandLine"] = command;
        methodParams["CurrentDirectory"] = @"C:\";

コマンドがいつ終了するかを判断する方法を理解する必要があります:)。ありがとう!

4

2 に答える 2

1

私の理解では、これを書くとき:

ManagementClass processTask = new ManagementClass(@"\\192.168.183.100\root\CIMV2", "Win32_Process", null);
ManagementBaseObject methodParams = processTask.GetMethodParameters("Create");
methodParams["CommandLine"] = "cmd.exe";
methodParams["CurrentDirectory"] = @"C:\";

//Execute the method
ManagementBaseObject outParams = processTask.InvokeMethod("Create", methodParams, null);

リモートプロセスを同期的に起動しているので、

outParams["returnvalue"]
outParams["processid"]

How To: Execute a Methodで説明されているように、戻りコードと processId を提供します。非同期で実行したい場合は、How To: Call a Method Asynchronously を読むことができます。

于 2011-12-12T19:55:41.563 に答える
0

同様の質問がここに投稿されています: Wait for service.InvokeMethod to finish - WMI, C#

次のドキュメント「方法: メソッドを実行する」および「方法: メソッドを非同期的に呼び出す」では、準同期および非同期の実行について説明しています。あなたがやっていることは準同期実行です。

私が知る限り、これは WMI がコマンドを正常に実行した場所に関するフィードバックを提供します。インストーラーの実行、サービスの停止、バッチ ファイルの実行など、長時間実行されるコマンドの場合、WMI は、インストーラーの起動時、サービスの停止を開始するように指示されたとき、またはバッチ ファイル プロセスの開始時に戻ります。

私が知る限り、新しいプロセスが終了するのを本当に待つには、プロセスが実行されているかどうかをポーリングするか、サービスが停止しているかどうかを照会する必要があります。あなたの場合、コマンドに応じて、プロセスIDをポーリングします。

これについては、私自身もまだ検討中です。

于 2013-04-22T22:27:38.353 に答える