2013-01-23 76 views

回答

5

要得到的結果直接就可以使用ManagementObject.InvokeMethod Method (String, ManagementBaseObject, InvokeMethodOptions)版本的InvokeMethod方法。

像這樣

using System; 
using System.Collections.Generic; 
using System.Management; 
using System.Text; 

namespace GetWMI_Info 
{ 
    class Program 
    { 
// This method is used to format the volume. 

     static void Main(string[] args) 
     { 
      try 
      { 
       ManagementScope Scope;     
       Scope = new ManagementScope("\\\\.\\root\\CIMV2", null); 

       Scope.Connect(); 
       ObjectGetOptions Options  = new ObjectGetOptions(); 
       ManagementPath Path   = new ManagementPath("Win32_Volume.DeviceID=\"\\\\\\\\?\\\\Volume{178edf63-2039-11e2-8012-005056c00008}\\\\\""); 
       ManagementObject ClassInstance= new ManagementObject(Scope, Path, Options); 
       ManagementBaseObject inParams = ClassInstance.GetMethodParameters("Format"); 


       ManagementBaseObject outParams= ClassInstance.InvokeMethod("Format", inParams ,null); 
       Console.WriteLine("{0,-35} {1,-40}","Return Value",outParams["ReturnValue"]); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace)); 
      } 
      Console.WriteLine("Press Enter to exit"); 
      Console.Read(); 
     } 
    } 
} 

現在,如果你使用的是ManagementOperationObserver對於異步執行,就可以得到結果的ObjectReady事件

像這樣

using System; 
using System.Collections.Generic; 
using System.Management; 
using System.Text; 

namespace GetWMI_Info 
{ 
    public class InvokeAsync 
    { 
     public InvokeAsync() 
     { 

      // Create a results watcher object, 
      ManagementOperationObserver results = new ManagementOperationObserver(); 

      // Attach handler to events for results and completion 
      results.ObjectReady += new ObjectReadyEventHandler(this.NewObject); 
      results.Completed += new CompletedEventHandler(this.Done); 

      ManagementScope Scope; 
      Scope = new ManagementScope("\\\\.\\root\\CIMV2", null); 

      Scope.Connect(); 
      ObjectGetOptions Options = new ObjectGetOptions(); 
      ManagementPath Path = new ManagementPath("Win32_Volume.DeviceID=\"\\\\\\\\?\\\\Volume{178edf63-2039-11e2-8012-005056c00008}\\\\\""); 
      ManagementObject ClassInstance = new ManagementObject(Scope, Path, Options); 
      ManagementBaseObject inParams = ClassInstance.GetMethodParameters("Format"); 


      ClassInstance.InvokeMethod(results, "Format", inParams, null); 

      while (!this.Completed) 
      { 
       System.Threading.Thread.Sleep(1000); 
      } 

      this.Reset(); 

     } 

     private bool isCompleted = false; 

     private void NewObject(object sender, 
      ObjectReadyEventArgs obj) 
     { 
      Console.WriteLine("ReturnValue : {0}", obj.NewObject["ReturnValue"]); 
     } 

     private bool Completed 
     { 
      get 
      { 
       return isCompleted; 
      } 
     } 

     private void Reset() 
     { 
      isCompleted = false; 
     } 

     private void Done(object sender, 
      CompletedEventArgs obj) 
     { 
      isCompleted = true; 
     } 

     public static void Main() 
     { 
      InvokeAsync example = 
       new InvokeAsync(); 

      return; 
     } 

    } 
} 
相關問題