首页 > 代码库 > Cmdlet开发与学习(六)

Cmdlet开发与学习(六)

      之前的内容主要是关于cmdlet开发的,下面要将的内容,是关于在应用程序中集成PowerShell引擎。

      运行空间和管道

      Runspace类是PowerShell引擎API的重要组成部分,Runspace实例代表一个PowerShell执行引擎实例,其中包含自己的一系列变量,驱动器映射,函数等。这些资源统称为运行空间的“会话状态”。

      创建并调用Pipeline类的实例,我们就可以在运行空间中使用命令行。Pipeline类实例代表PowerShell命令行对象,其中包含各种命令,命令参数,入口,以及一组输入流,输出流,错误流管道。

      引用System.Management.Automation.dll      

 

      执行命令行

      RunspaceInvoke vs Runspace and Pipeline

      RunspaceInvoke实例封装了Runspace和Pipeline类对象的基本功能,简化了许多工作,比如管道创建,I/O管理等。

      RunspaceInvoke使用起来很简单,但是这样做是有代价的,即不能灵活使用Runspace和Pipeline中的API函数。如果仅仅想执行一条命令,并同步获得输出结果,那么RunspaceInvoke是一个很好的选择。否则,建议还是使用Runspace和Pipeline组合。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Runspace runspace = RunspaceFactory.CreateRunspace();
 6             runspace.Open();
 7             Pipeline pipeline = runspace.CreatePipeline("calc");
 8             pipeline.Input.Close();
 9             pipeline.Invoke();
10         }
11     }

      

       管道中的输入,输出和错误

       Pipeline只能处理输入流,输出流,错误流对象。Pipeline.Invoke方法执行之后,返回值类型是Collection<PSObject>

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Runspace runspace = RunspaceFactory.CreateRunspace();
 6             runspace.Open();
 7 
 8             Pipeline pipeline = runspace.CreatePipeline("$input | sort-object");
 9             int[] numbers = { 3, 2, 1 };
10             pipeline.Input.Write(numbers, true);
11 
12             Collection<PSObject> results = null;
13             try
14             {
15                 results = pipeline.Invoke();
16             }
17             catch (RuntimeException ex)
18             {
19                 Console.WriteLine("Exception during Invoke(): {0}, {1}",ex.GetType().Name, ex.Message);
20                 return;
21             }
22             foreach (PSObject item in results)
23             {
24                 Console.WriteLine("Result is : {0} ",item.BaseObject);
25             }
26         }
27     }

       

       管道对象的错误管道返回的错误都打包在一个ErrorRecord实例中,ErrorRecord对象包含了丰富的信息。

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             Runspace runspace = RunspaceFactory.CreateRunspace();
 6             runspace.Open();
 7 
 8             Pipeline pipeline = runspace.CreatePipeline("get-childitem hklm:\\");
 9             pipeline.Invoke();
10 
11             while (!pipeline.Error.EndOfPipeline)
12             {
13                 Console.WriteLine("Error : {0}", pipeline.Error.Read());
14             }
15         }
16     }

 

       PSObject对象

       PSObject是PowerShell脚本语言访问各种对象的接口,为.Net开发人员提供了标准的抽象。

       构造PSObject对象有三种方法:

       1.PSObject(object):公开了原对象的方法和属性

       2.PSObject():简单空对象,没什么功能。目的是允许自定义新的方法和属性(扩展型成员),并添加到PSObject中

       3.PSObejct.AsPSObject(object):这是Windows PowerShell内部最常用的创建PSObject对象的方法。首先检查object是否是PSObject对象,如果是,就返回改对象,否则调用1的构造函数。

       注意:object不能为null。

       

       ImmediateBaseObject属性和BaseObject属性

       这两个属性,对于管道输出对象的内部属性访问,起到很重要的作用。

       BaseObject:该属性返回被PSObject封装的对象。如果封装的对象也是一个PSObject对象的话,则返回该对象的基类对象,直至找到一个非PSObject的对象为止。本属性确保您可以找到被封装起来的CLR对象。

       ImmediateBaseObject:该属性返回被PSObject封装的对象,即使该封装对象是一个PSObject对象,也返回该对象。这个属性只返回继承关系上最近的对象。

 

 1         static void Main(string[] args)
 2         {
 3             DateTime date = new DateTime(2014,5,11);
 4             PSObject psObj1 = new PSObject(date);
 5             PSObject psObj2 = new PSObject(psObj1);
 6 
 7             Object obj = psObj2.ImmediateBaseObject;
 8             Console.WriteLine(obj.GetType().FullName);
 9 
10             obj = psObj2.BaseObject;
11             Console.WriteLine(obj.GetType().FullName);
12         }