• 作为平台的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

  • 相关阅读:
    在django中使用orm来操作MySQL数据库的建表,增删改
    TCP中的粘包问题,以及用TCP和UDP实现多次聊天
    网络编程概念
    面向对向---封装
    xlrd模块读取Excel表中的数据
    curl和wget的区别和使用
    WebSocke
    HTTP状态码(响应码)
    IO模型
    Redis为什么使用单进程单线程方式
  • 原文地址:https://www.cnblogs.com/dreamer-fish/p/3941540.html
Copyright © 2020-2023  润新知