在此系列文章的前一篇,我们看到了怎样使用System.Management.Automation.PowerShell 类来在c#应用程序中运行PowerShell 命令。在那些例子中,我们创建的都是默认的运行空间。在这篇文章中,我们一起来看怎样自定义运行空间?比如,可能存在一种情况,你不想用户可以使用那些能更改机器状态的特定命令。这样,你现在可以创建一个不包含那些命令的命名空间,这样用户就访问不到它们了。我们看看应当怎么做。有很多类型可以被用来托管Windows PowerShell。下面列出其中最重要的几种托管Windows PowerShell的类型(作为基本托管场景)

我们来看一个非常简单的托管Windows PowerShell的例子。

1
2
3
4
5
PowerShell ps = PowerShell.Create();
 ps.AddCommand("Get-Command")
 .AddParameter("CommandType","Cmdlet")
 .AddParameter("ListImported","true");
 ps.Invoke();

该示例创建了一个PowerShell对象。不怎么明显,但是当你使用Create()方法时,就已经创建了一个运行空间。默认情况下,它会把PowerShell 内置的命令全部加载进运行空间。在Windos 8上运行上面的命令(在运行空间中列出的命令),会添加259条命令。内存使用并不高效。

在很多情况下,人们想创建一个只包含特定命令集合和语言元素的运行空间。只包含了有限的命令集合的运行空间被称为“约束运行空间”,详细可以参考这里。要创建一个约束运行空间,我们需要创建一个“初始会话状态”(InitialSessionState)对象,用来限制用户用什么命令。

创建一个托管Windows PowerShell的约束运行空间需要4个步骤:

  1. 创建一个InitialSessionState(InitialSessionState可以认为是一个在运行空间打开时,用来存储可用命令集的一个容器 。)
  2. 向InitialSessionState中添加你需要的命令。
  3. 为初始会话状态创建一个运行空间 ( 一个运行空间是Windows PowerShell 能够运行的环境。)
  4. 打开运行空间,让运行空间就绪等待命令执行。
  5. 基于该运行空间来创建一个PowerShell对象,添加命令,然后执行命令。(这部分和上一篇文章中演示的一样)

使用所有内置的核心命令来创建InitialSessionState

下面是一个使用约束运行空间技术根据所有核心命令来创建初始会话状态的例子。使用 CreateDefault()方法创建一个初始会话状态,然后根据初始会话状态创建一个运行空间,打开这个运行空间,再运行运行空间中的命令。步骤四中的命令使用了PowerShell 对象中的Runspace属性,指定自定义运行空间(rs)。

(在这个步骤中我们跳过了步骤二(添加我们期望的命令)。我会在下一个例子中解释那部分。)

步骤 1

1
InitialSessionState iss = InitialSessionState.CreateDefault();

步骤 2

Runspace rs = RunspaceFactory.CreateRunspace(iss);

步骤 3

rs.Open();

步骤 4

1
2
3
4
PowerShell ps = PowerShell.Create();
 ps.Runspace = rs;
ps.AddCommand("Get-Command");
 ps.Invoke();

InitialSessionState 有三个不同的方法来创建存储命令的容器

  • Create – 创建一个空的容器。容器中没有添加任何命令。
  • CreateDefault – 创建一个包含了机器上所有Windows  PowerShell 内置命令的会话状态。使用这个API,所有PowerShell内置的的命令都会被以管理单元的形式加载进去。
  • CreateDefault2 – 创建一个仅包含托管Windows PowerShell 最小集合的命令集。使用这个API,只会有一个管理单元Microsoft.PowerShell.Core被加载。

上一个例子中创建的InitialSessionState对象,默认加载了所有Windows PowerShell内置的命令。我们可以通过创建一个空的InitialSessionState对象,然后添加我们所需的命令,来进一步约束它。

创建一个空的InitialSessionState,并添加命令

在这个示例中,我们创建一个空的初始会话状态,然后使用SessionStateCmdletEntry  类来为初始会话状态定义命令集。使用这个类,我们分别为Get-Command和Import-Module创建了一个命令项,然后将这些命令项添加进初始会话状态。这就使这些命令能在会话中的管道中运行了。其结果就是那个会话中仅仅包含了Get-Command和Import-Module两个命令。

步骤 1 – 创建一个空的InitialSessionState对象

1
InitialSessionState iss = InitialSessionState.Create();

步骤 2 – 添加要运行的命令

1
2
3
4
5
6
SessionStateCmdletEntry getCommand = new SessionStateCmdletEntry(
 "Get-Command"typeof(Microsoft.PowerShell.Commands.GetCommandCommand), "");
 SessionStateCmdletEntry importModule = new SessionStateCmdletEntry(
 "Import-Module"typeof(Microsoft.PowerShell.Commands.ImportModuleCommand), "");
 iss.Commands.Add(getCommand);
 iss.Commands.Add(importModule);

步骤 3 – 创建运行空间

1
Runspace rs = RunspaceFactory.CreateRunspace(iss);

步骤 4 – 打开运行空间

1
rs.Open();

步骤 5 – 执行运行空间中的命令

1
2
3
4
5
6
7
8
PowerShell ps = PowerShell.Create();
 ps.Runspace = rs;
 ps.AddCommand("Get-Command");
 Collection<CommandInfo> result = ps.Invoke<CommandInfo>();
 foreach (var entry in result)
 {
 Console.WriteLine(entry.Name);
 }

输出

Get-Command
Import-Module

我们在这里创建的运行空间仅包含了 Get-Command和Import-Module两条命令。创建了一个空的 InitialSessionState,然后添加命令。这使得应用程序在内存使用上,非常高效。在上一个例子中,我们也可以通过显式的创建一个运行空间来完成它。System.Management.Automation.PowerShell 类有一个公共的API Create,可以接收InitialSessionState参数。使用此版本,步骤3,4,和5可以被下面的命令所代替。

1
2
3
4
5
6
7
PowerShell ps = PowerShell.Create(iss);
 ps.AddCommand("Get-Command");
 Collection<CommandInfo> result = ps.Invoke<CommandInfo>();
 foreach (var entry in result)
 {
 Console.WriteLine(entry.Name);
 }

PowerShell 运行空间性分析

下面这张图表展示了使用不同方法来创建InitialSessionState的执行时间。

PowerShell 运行空间性能图

正如在这些例子中看到的那样,InitialSessionState提供了一个非常优秀的机制来创建一个仅包含了你想暴露的命令的运行空间。

Windows PowerShell SDK 已经包含了许多托管Windows PowerShell的例子。更多关于Windows PowerShell SDK 的信息可以参考这里

Original Author: Indhu Sivaramakrishnan(Windows PowerShell Developer)

From:http://www.pstips.net/paap-windows-powershell-as-a-platform-part-1.html

   http://blogs.msdn.com/b/powershell/archive/2013/10/01/paap-windows-powershell-as-a-platform-part-1.aspx

作为平台的Windows PowerShell(二)的更多相关文章

  1. 作为平台的Windows PowerShell(一)

    除了作为一种脚本语言外,Windows PowerShell被多种应用程序使用.这是因为Windows PowerShell引擎可以被托管在一个应用程序内部.这篇博文和下一篇博文将会处理在C#应用程序 ...

  2. SNF开发平台WinForm之十二-发送手机短信功能调用-金笛-SNF快速开发平台3.3-Spring.Net.Framework

    1.调用前组装参数 2.调用发送信息服务脚本   .调用前组装参数: BaseSendTaskEntity entity = new BaseSendTaskEntity(); entity.Mess ...

  3. SharePoint 2010 最佳实践学习总结------第2章 SharePoint Windows PowerShell指南

    第2章 SharePoint Windows PowerShell指南 SharePoint 2010是SharePoint系列产品中第一个开始支持Windows PowerShell的产品,在以前的 ...

  4. Windows PowerShell:管理服务器

    一.概述 Cmdlets 用于服务器的管理方面主要体现在4个方面:服务.日志.进程.服务器管理器. 1.服务 •  Get-Service.查看某个服务的属性. •  New-Service.创建一个 ...

  5. Windows PowerShell漫谈-win7下没有超级终端

    Windows PowerShell是我在研究win7新特性的时候发现的新工具,起初没有对它产生太大的兴趣,只是简单看看了有关它的介绍.简单使用了一下,感觉上它和cmd.exe没有本质区别.对它产生兴 ...

  6. Windows PowerShell基本语法及常用命令

    PowerShell常用命令: 一 Get类 1.Get-Command : 得到所有PowerShell命令,获取有关 cmdlet 以及有关 Windows PowerShell 命令的其他元素的 ...

  7. linux平台及windows平台mysql重启方法

    各个平台mysql 重启: inux平台及windows平台mysql重启方法 Linux下重启MySQL的正确方法: 1.通过rpm包安装的MySQL service mysqld restart ...

  8. Windows PowerShell 学习之——Cmdlet处理生命周期

    这一次介绍一下Cmdlet处理过程的生命周期 总共分为六个部分 1.概述 2. 命令行输入绑定参数(parameters) 3. 开始指令处理 4. 接受管道输入绑定参数 5. 处理记录 6. 处理记 ...

  9. 使用Windows Powershell卸载和安装Win10 原生应用的方法

    新装的Win10带有大量的实际工作和生活中不怎么常用的APP,如果觉得这些APP占用磁盘空间或者想要卸载这些应用(APP),Win10下并不能使用Windows 应用管理器直接图形化地卸载这些应用,而 ...

随机推荐

  1. 1701. Ostap and Partners(并查集-关系)

    1701 又是类似食物链的这一类题 这题是找与根节点的和差关系 因为0节点是已知的 为0  那么所有的都可以转换为与0的和差关系 可以规定合并的两节点 由大的指向小的 然后再更新和差关系 有可能最后有 ...

  2. (转载)Web存储和SessionStorage locaStorage

    <转> sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在 ...

  3. BZOJ2893: 征服王

    题解: 裸的上下界最小流是有问题的.因为在添加了附加源之后求出来的流,因为s,t以及其它点地位都是平等的.如果有一个流经过了s和t,那么总可以认为这个流是从s出发到t的满足题意的流. 既然可能存在s到 ...

  4. [.NET MVC进阶系列03] Views 视图基础

    [注:此文对应Chapter 3:Views] 一.View的功能: 1.View用来呈现页面UI,通过Controller来指定View: 要注意的是,MVC和以前基于文件的Web应用不同,URL指 ...

  5. Azure 负载平衡器新分发模式

    Yves Pitsch Azure 网络首席项目经理 Azure负载平衡器是一种第四层(TCP.UDP)类型的负载平衡器,它可以将传入流量分发到云服务中正常运行的服务实例上,或者分发到负载平衡器集内所 ...

  6. 如何配置Flash Media Live Encoder (FMLE)从而使用Azure直播服务

    Azure媒体服务中的直播服务已经在中国Azure开始公共预览.通过这篇英文博客,您可以了解到直播服务对RTMP协议的支持.以及多种客户端编码器的配置. http://blogs.msdn.com/b ...

  7. 【转】使用NDK生成native C/C++的可执行程序

    原文网址:http://www.linuxidc.com/Linux/2011-08/40901.htm 众所周知, NDK可以生成lib,让java程序通过jni来调用,其实,NDK也可以生成C/C ...

  8. 我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

    我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp) 分类: [自动化]2007-07-19 10:04 34038人阅读 评论(38) 收藏 举报 vb嵌入式dostcp ...

  9. DbHelper and OracleHelper

    1 连接Sql Server的ConnectionString: Data Source=.;Initial Catalog=ViewVideo;User ID=sa;Password=XXXXXX; ...

  10. codeforces 629D 树状数组+LIS

    题意:n个圆柱形蛋糕,给你半径 r 和高度 h,一个蛋糕只能放在一个体积比它小而且序号小于它的蛋糕上面,问你这样形成的上升序列中,体积和最大是多少 分析:根据他们的体积进行离散化,然后建树状数组,按照 ...