zoukankan      html  css  js  c++  java
  • 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         }
  • 相关阅读:
    centos7 安装svn, 同时支持 svn 和 http访问
    Maven单独构建多模块项目中的单个模块
    openfalcon agent 监控数据
    kubernetes 垃圾回收机制
    docker tomcat 已主机名为日志输出路径
    k8s mongodb 集群配置
    修改Centos7的网卡ens32 改为eth0
    jenkins发版脚本更新
    Git系列七之备份迁移 升级 恢复管理
    confluence wiki搭建使用
  • 原文地址:https://www.cnblogs.com/ByronsHome/p/3721822.html
Copyright © 2011-2022 走看看