首页 > 代码库 > 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 }