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

将给出返回码和 processId,如How To: Execute a Method中所述,如果您想异步运行它,您可以阅读:How To: Call a Method Asynchronously

于 2011-12-12T19:55:41.563 回答
0

这里发布了一个类似的问题:等待 service.InvokeMethod to finish - WMI, C#

以下文档如何:执行方法如何:异步调用方法描述了半同步和异步执行。您正在做的是半同步执行。

据我所知,这提供了有关 WMI 在何处成功执行命令的反馈。如果它是一个长时间运行的命令,例如运行安装程序、停止服务或执行批处理文件,WMI 将在安装程序启动、服务被告知开始停止或批处理文件进程启动时返回。

要真正等待新进程退出,据我所知,您需要轮询以查看进程是否正在运行,或者查询服务是否已停止。在您的情况下,根据命令轮询进程 ID。

我自己也在研究这个。

于 2013-04-22T22:27:38.353 回答