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 }

Cmdlet开发与学习(六),布布扣,bubuko.com

时间: 2024-12-05 02:48:16

Cmdlet开发与学习(六)的相关文章

Cmdlet开发与学习(四)

前面讲完了一个基本的cmdlet的开发流程,下面将陆续地完善cmdlet的功能细节以及补充.       支持ShouldProcess       有的cmdlet操作有很大的破坏性,因此有必要再命令执行前提醒用户注意一些可能的执行后果,也就是说,存在与用户的交互.这个时候,通过使用ShouldProcess,可以达到预期的效果. 1 [Cmdlet(VerbsCommon.Get,"SQLServerBackupFile", 2 SupportsShouldProcess = tr

Cmdlet开发与学习(五)

Parameter       在声明cmdlet参数的时候,我们使用了Parameter标识符,在这个标识符中,有些参数需要了解到. 强制参数 设置Mandatory=true即可. 对于强制参数,不管是在命令行中绑定,还是通过管道输入,在命令逻辑执行之前,它就必须绑定好.如果强制参数没有参数值的话,PowerShell会弹出对话框,要求用户提供参数值. 位置参数.       Position= n       有时,我们在使用Powershell的时候,发现仅仅是输入参数值,并没有指定具体

Cmdlet开发与学习(二)

继续上一篇的内容,既然已经定义好了命令,那么我们还可以参数绑定,定义自己的参数对象. 3.定义属性,即cmdlet参数对象       参数绑定时基于cmdlet元数据进行的,cmdlet元数据是在命令发现过程中得到的.首先,基于cmdlet的类型(包括可执行程序,脚本文件,内置函数等),PowerShell实例化一个cmdlet.然后,通过查询cmdlet元数据中的参数信息,判断参数列表是否合法,或者,该命令参数是否需要参数值. 参数绑定的实现相当简单,只需要对属性加上Parameter标示符

Cmdlet开发与学习(一)

Windows Powershell和cmdlet的学习是一个积累的过程.最近在学习编写自定义的Cmdlet封装一些命令,以此记录自己的学习心得. 自定义cmdlet的实现大致可以分为以下几步: 1.将.Net类声明为cmdlet 2.继承自类PSCmdlet或者Cmdlet 3.定义属性,即cmdlet参数对象 4.重写cmdlet记录处理的方法 5.流程或诊断信息输出,错误以及异常处理 6.PSSnapIn和Module 1.将.Net类声明为cmdlet        要将.Net类声明为

Cmdlet开发与学习(三)

5.流程或诊断信息输出,错误以及异常处理       在使用PowerShell的过程中,如果cmdlet执行有输出结果,我们会在PS界面看到结果输出信息.如果cmdlet执行出现异常,那我们就会看到异常信息.接着我们就开始学习这些输出信息的实现. Cmdlet基类给我们提供了几种输出方法:WriteDebug, WriteError, WriteObject, WriteProcess, WriteVerbose, WriteWarning. WriteDebug:该方法是为cmdlet开发人

Cmdlet开发与学习(七)

到目前的例子为止,我们使用的都是不带参数的CreateRunspace()方法创建的运行空间实例,这就意味着,我们使用的都是默认的命令集合,提供程序,初始化脚本和格式信息. 但是,这些默认的配置信息都是可以控制的,这要通过RunspaceConfiguration类实现.RunspaceConfiguration类是CreateRunspace函数的参数.创建运行空间实例后,其中的会话状态变量可以通过运行空间实例的SessionStateProxy来设置和获取. 注意:如果运行空间处于Befor

ios开发网络学习六:设置队列请求与RunLoop

#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self newThreadDelegate2]; } -(void

微信公众平台开发(学习)1

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M

Beaglebone Back学习六(Can总线测试)

Can总线测试 1 Can总线 控制器局域网 (Controller Area Network, 简称 CAN 或 CANbus)是一种通信协议,其特点是允许网络上的设备直接互相通信,网络上不需要主机(Host)控制通信.是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898).CAN总线原理是通过CAN总线.传感器.控制器和执行器由串行数据线连接起来.它不仅仅是将电缆按树形结构连接起来,其通信协议相当于ISO/OSI参考模型中的数据链路层,网络可根据协