zoukankan      html  css  js  c++  java
  • 作为平台的Windows PowerShell(一)

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

    用来托管Windows Powershell最为重要的一个类型是System.Management.Automation.PowerShell类。这个类提供了用来创建命令管道和在运行空间中执行命令的方法。

    添加命令(AddCommand)

    让我们来看一个非常简单的例子。假设你想得到当前机器上运行的进程的一个列表。执行命令的方式如下。

    步骤 1 – 创建一个 PowerShell 对象

    1
    PowerShell ps = [PowerShell]::Create();

    步骤 2 – 添加你想执行的命令

    1
    ps.AddCommand(“Get-Process”);

    步骤 3 –执行这些命令

    1
    ps.Invoke();

    你也可以像这样一步到位执行这些步骤:

    1
    [PowerShell]::Create().AddCommand(“Get-Process”).Invoke();

    添加参数(AddParameter)

    上面执行单个命令的例子没有任何参数。比方说,我想得到运行在当前机器上的所有PowerShell进程。我就可以使用AddParamete方法来给命令添加参数了。

    1
    2
    3
    [PowerShell]::Create().AddCommand(“Get-Process”)
                       .AddParameter(“Name”, “PowerShell”)
                       .Invoke();

    如果想添加更多参数,可以像这样继续调用:

    1
    2
    3
    4
    [PowerShell]::Create().AddCommand(“Get-Process”)
                       .AddParameter(“Name”, “PowerShell”)
                       .AddParameter(“Id”, “12768”)
                       .Invoke();

    或者,如果你有一个包含参数名和参数的词典,可以使用AddParameters ,来添加所有参数。

    1
    2
    3
    4
    5
    6
    IDictionary parameters = new Dictionary<String, String>();
    parameters.Add("Name""PowerShell");
    parameters.Add("Id""12768");
    [PowerShell]::Create().AddCommand(“Get-Process”)
               .AddParameters(parameters)
               .Invoke()

    添加语句(AddStatement)

    现在我们已经执行了一个单独的命令和它的参数,让我们再来执行一堆命令。PowerShell API给我们提供了一个模拟批处理的方式,这样就可以在管道的末尾追加额外的语句。获取所有正在运行的进程,然后再获取所有正在运行的服务,可以这样做:

    1
    2
    3
    4
    PowerShell ps = [PowerShell]::Create();
    ps.AddCommand(“Get-Process”).AddParameter(“Name”, “PowerShell”);
    ps.AddStatement().AddCommand(“Get-Service”);
    ps.Invoke();

    添加脚本(AddScript)

     AddCommand方法只能添加命令。如果我想运行一个脚本,我可以使用 AddScript 方法。假设我们有一个简单的脚本,a.ps1,可以获取机器上所有运行的PowerShell进程的的数量。

    1
    2
    3
    4
    5
    6
    ------------D:PshTempa.ps1----------
    $a Get-Process -Name PowerShell
    $a.count
    ------------D:PshTempa.ps1----------
    PowerShell ps = [PowerShell]::Create();
    ps.AddScript(“D:PshTempa.ps1”).Invoke();

    AddScript API也提供了一个选项来在本地作用域运行脚本。在下面的例子中,脚本会在本地作用域中来执行,因为我们将true传递给了参数useLocalScope 。

    1
    2
    PowerShell ps = [PowerShell]::Create();
    ps.AddScript(@“D:PshTempa.ps1”, true).Invoke();

    处理错误,详细消息,警告和进度信息(Handling Errors, Verbose, Warning, Debug and Progress Messages)

    PowerShell API也能让我们访问命令运行时产生的错误和详细信息等。你可以使用PowerShell.Streams.Error属性获取错误信息,和PowerShell.Streams.Verbose 属性获取详细信息。下面的属性也可以获取进度,调试,和警告信息。

    1
    2
    3
    4
    PowerShell ps = [PowerShell]::Create()
                              .AddCommand("Get-Process")
                              .AddParameter("Name""Non-ExistentProcess");
    ps.Invoke();

    ps.Streams.Error有一个命令运行时产生的错误列表,下面的情况,我们在查询一个不存在的进程时得到了一个错误

    1
    2
    3
    4
    5
    6
    Get-Process : Cannot find a process with the name "Non-ExistentProcess".
    Verify the process name and call the cmdlet again.
    + CategoryInfo : ObjectNotFound: (Non-ExistentProcess:String) [Get-Process],
    ProcessCommandException
    + FullyQualifiedErrorId :
    NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

    PowerShell API 非常强大。它能让我们在同步/异步模式下运行命令,创建一个只能运行有限命令集的受约束的运行空间,在嵌套的管道中执行命令,等等。

    在本文中的所有例子中,我们创建了一个包含了所有Windows PowerShell 内置命令的默认运行空间,这在内存消耗方面并不高效。在更多的场景中,用户可能想创建一个只包含指定命令集/语言元素的运行空间。在下一篇博文中,我们会解释如何创建一个受限制但是效率更高的运行空间。

     Original Author: Indhu Sivaramakrishnan [MSFT] (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

  • 相关阅读:
    BZOJ 3506 机械排序臂 splay
    BZOJ 2843 LCT
    BZOJ 3669 魔法森林
    BZOJ 2049 LCT
    BZOJ 3223 文艺平衡树 splay
    BZOJ 1433 假期的宿舍 二分图匹配
    BZOJ 1051 受欢迎的牛 强连通块
    BZOJ 1503 郁闷的出纳员 treap
    BZOJ 1096 ZJOI2007 仓库设计 斜率优化dp
    BZOJ 1396: 识别子串( 后缀数组 + 线段树 )
  • 原文地址:https://www.cnblogs.com/dreamer-fish/p/3941540.html
Copyright © 2011-2022 走看看