介绍 .NET Framework 3.0/Windows PowerShell
Windows PowerShell (代号:Monad) 是一种基于命令行的接口 (CLI)。它没有随 Windows Vista 的早期版本一起提供,但无论如何,它都可以在 Windows XP、Windows 2003 Server 和 Windows Vista 中使用。
Windows PowerShell 是 Exchange Server 2007、System Center Virtual Machine Manager 2007 和 System Center Operations Manager 2007 管理工具的基础,其中所有操作都是通过命令行接口完成的,管理 GUI 则构建在这些命令之上。
Windows PowerShell 按照一个名为“单子论”的系统工作,该系统认为整个地球是由相互之间没有联系的形而上学结构(称为单子)组成的。Windows PowerShell 的“单子”是称为“cmdlet”的对象。在 Windows Script Host 失败后,微软早在 2003 年就开始着手开发 Windows PowerShell。与 Windows Script Host 不同,Windows Powershell 直接与 shell 交互,并且具有很高的安全性。
Windows Powershell 不使用管道或流数据来进行服务之间的通信,而是使用不同远程机器上的两个 cmdlet 之间的对象到对象的通信。进程列表将不包含描述它们的文本,而是表示它们的“对象”,这样就可以在这些对象上调用方法,而无需显式引用任何外部结构或库。
Windows PowerShell 在一个宿主应用程序(默认情况下为 powershell.exe)中运行,该应用程序向用户公开命令行,并使用宿主接口与命令行调用的命令进行通信。宿主应用程序可以是控制台应用程序、Windows 应用程序或 Web 应用程序。在大多数情况下,宿主应用程序使用其 Main 函数通过内部宿主接口与 Windows PowerShell 运行时进行交互;但是,宿主应用程序可以选择通过实现 PSHost 类以及一个或多个相关的用户界面类来支持它自己的自定义宿主。这些类共同允许应用程序和 Windows PowerShell 命令之间的直接通信。
宿主应用程序在与 Windows PowerShell 运行时进行通信时,必须首先执行的操作是创建运行空间,运行空间是 Windows PowerShell 运行时的抽象,用于简化用户会话。为此,宿主应用程序调用 RunspaceFactory 类的 CreateRunspace 方法。运行空间本身由 Runspace 对象表示。此外,Windows PowerShell 还提供了 RunspaceConfiguration 类来定义运行空间的配置。配置信息包括有关宿主应用程序支持的命令和 Windows PowerShell 提供程序的数据,以及运行空间的启动脚本。用户脚本不会反映在运行空间配置中。当创建运行空间时,会自动打开相应的会话,其状态由 SessionState 对象表示。会话状态数据包括有关 Windows PowerShell 路径、Windows PowerShell 驱动器、Windows PowerShell 提供程序以及在会话期间处于活动状态的 cmdlet 和其他命令的信息。
当宿主应用程序创建运行空间后,它必须为所需的会话类型打开运行空间。对于使用同步 I/O 的会话,应用程序可以调用 Open 方法。如果应用程序使用异步 I/O 并且必须在运行空间完成读/写请求时执行其他操作,它可以调用 OpenAsync 方法。如果调用 OpenAsync,定义自定义宿主的宿主应用程序将需要支持适当的回调方法来接收 I/O 通知。
打开运行空间后,宿主应用程序可以通过在运行空间中创建和调用管道来操作会话,如“处理命令”中所述。
运行空间允许宿主应用程序通过调用会话的 SessionStateProxy 对象的 GetVariable 和 SetVariable 方法来操作会话。
当宿主应用程序从用户那里收集到一个命令序列时,它必须将这些命令组合成一个或多个管道,每个管道由活动运行空间的 Pipeline 对象表示。
命令序列可以由多个嵌套管道组成,这些管道由分号 (;) 语句分隔符隔开。以下是一个此类序列的示例。
PS>pqr | bar; a | b
Windows PowerShell 运行时将此序列表示为一个管道,其中包含两个嵌套管道,pqr | bar 和 a | b。
要创建自己的管道,宿主应用程序可以调用 CreatePipeline 方法或 CreateNestedPipeline 方法。应用程序调用 CreatePipeline 来形成一个空管道,或者如果它必须创建一个管道并用命令填充它。如果应用程序必须为运行空间创建一个管道,而其当前管道正在执行,则必须调用 CreateNestedPipeline。
现在管道已设置好,宿主应用程序必须启动其操作。如果应用程序使用同步 I/O,则它调用 Invoke 方法,使用针对空管道或填充管道的变体。对于异步 I/O,应用程序可以改为调用 InvokeAsync。
第一个版本包含以下特性
- 一种类似 C# 的脚本语言,支持哈希表、可以对正则表达式进行测试的 switch 语句、数组切片和匿名方法(脚本块),这些脚本块可以存储为数据,然后在以后执行。它还提供了循环(for/foreach/while)、条件语句(if/switch)、变量作用域(全局/脚本/局部)以及定义函数的能力。
- Cmdlet 继承了某些选项,允许用户选择交互级别以及如何处理错误。产生副作用的 cmdlet 支持
-WhatIf
和-Confirm
选项。-WhatIf
会通知用户将会发生什么,但不会执行任何操作。-Confirm
会通知用户将要发生什么,并允许用户控制是否执行操作。 - 处理错误的一个选项是调用“挂起”功能,该功能允许用户进入一个新的命令 shell,调查问题,然后恢复原始命令。用户可以定义在这种情况下显示的提示。
- 一个可扩展的 提供程序 模型允许访问和操作文件系统和其他层次结构数据存储。一些示例:PowerShell 带有一个注册表提供程序,允许通过“HKLM”和“HKCU”配置单元访问注册表;使用它,可以通过在 shell 提示符处执行类似“dir HKLM:\SOFTWARE\Microsoft”的命令来浏览注册表。PowerShell 带有证书存储、环境以及 shell 函数和别名的提供程序。与 cmdlet 一样,提供程序模型也是可扩展的,允许第三方创建自己的提供程序模型并将其插入 PowerShell。
- 一个名为“执行策略”的概念,它允许对 PowerShell 脚本执行施加粗粒度的安全约束。执行策略定义了 PowerShell 加载配置文件和运行脚本的限制。四种执行策略分别是:受限(Restricted)、全部签署(AllSigned)、远程签署(RemoteSigned)和不受限(Unrestricted)。
- 支持使用脚本签名来验证脚本发布者的身份,并使用数字签名验证已发布脚本的完整性。
- 命令行选项通常是完整的单词,但可以指定为最少数量的字母以消除歧义。例如,选项 `-show-detailed-information` 可以输入为 `-s`,如果其他选项没有以 's' 开头。
- 全面且可扩展的选项卡自动完成功能。与 Bash 和 zsh 等 shell 中的高级自动完成功能相比,当前版本的 Windows 中的 cmd.exe shell 只能自动完成文件或目录名称。
- 能够将命令的输出分配给变量,该变量将成为一个对象或对象数组,可以以任何想要的方式进行检查。