之前的内容主要是关于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 }