2011-09-21 37 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。

我还在自己调查。