.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 脚本宿主失败后,微软早在 2003 年就开始开发 Windows PowerShell。与 Windows 脚本宿主不同,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 加载配置文件和运行脚本的限制。四种执行策略分别是受限、完全签名、远程签名和不受限制。
- 支持使用脚本签名来验证脚本发布者的身份,并使用数字签名验证已发布脚本的完整性。
- 命令行选项通常是完整的单词,但可以指定为区分它们所需的最小字母数。例如,选项
-show-detailed-information
如果没有任何其他选项以“s”开头,则可以输入为-s
。 - 全面且用户可扩展的选项卡自动完成功能。当前版本的 Windows 中的 cmd.exe shell 只能完成文件或目录名称,而与 Bash 和 zsh 等 shell 中的高级自动完成功能形成对比。
- 能够将命令的输出分配给变量,该变量随后将成为对象或对象数组,可以按任何所需的方式进行检查。