2011-09-21 33 views
1

我正在通過WMIC執行遠程CMD命令行,這需要幾秒鐘的時間才能運行。在繼續前,我正在做Thread.Sleep(4000)...那裏必須有更好的方法!是否有一個變量或方法可用於確定我發出的命令是否完成/狀態字節?WMIC MangementClass RemoteCommand - 確定何時完成? STDOUT?

謝謝!使用

林下面的代碼來發出命令:

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

只需要弄清楚如何確定當命令完成:)。謝謝!

回答

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"] 

會給返回代碼的ProcessID在How To: Execute a Method解釋,如果你想異步運行它,你可以閱讀:How To: Call a Method Asynchronously

0

有一個類似的問題張貼在這裏:Wait for service.InvokeMethod to finish - WMI, C#

以下文檔How To: Execute a MethodHow To: Call a Method Asynchronously描述半同步和異步執行。你在做什麼是半同步執行。

據我所知,這提供了關於WMI在哪裏成功執行命令的反饋。如果是長時間運行的命令,如運行安裝程序,停止服務或執行批處理文件,則WMI將在安裝程序啓動時返回,服務被告知開始停止或啓動批處理文件進程。

要真正等待新進程退出,就我所知,您需要輪詢以查看進程是否正在運行,或者查詢服務是否停止。在你的情況下,根據命令,輪詢進程ID。

我還在自己調查。