【问题标题】:WMIC MangementClass RemoteCommand - determining when it is finished? STDOUT?WMIC MangementClass RemoteCommand - 确定何时完成?标准输出?
【发布时间】:2011-09-21 15:58:39
【问题描述】:

我正在通过 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:\";

只需要弄清楚如何确定命令何时结束 :)。谢谢!

【问题讨论】:

    标签: c# wmi wmic


    【解决方案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

    【讨论】:

      【解决方案2】:

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

      以下文档 How To: Execute a MethodHow To: Call a Method Asynchronously 描述了半同步和异步执行。你正在做的是半同步执行。

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

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

      我自己也在研究这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多