编写脚本简介

已完成

编写 PowerShell 脚本是指用 PowerShell 语言编写一组语句并将这些语句存储在文本文件中。 为什么要这样做? 使用 PowerShell 一段时间后,你会发现自己会重复某些任务,如生成日志报告或管理用户。 如果经常重复某些操作,最好是将其自动化:将其存储为便于重复使用的方式。

自动执行任务的步骤通常包括对 cmdlet、函数、变量等内容的调用。 若要存储这些步骤,你需要创建以“.ps1”结尾的文件并保存。 然后,你将拥有一个可运行的脚本。

开始学习脚本之前,让我们先大致了解一下 PowerShell 脚本语言的功能:

  • 变量。 你可以使用变量来存储值。 还可以将变量用作命令的参数。

  • 函数。 函数是语句的命名列表。 函数生成在控制台中显示的输出。 还可以将函数用作其他命令的输入。

    注意

    许多使用 PowerShell 执行的任务都涉及对系统状态(本地或其他)的副作用或修改。 通常,输出是次要问题(例如报告数据)。

  • 流控制。 流控制是通过使用 IfElseIfElse 之类的构造来控制各种执行路径的方法。

  • 循环。 循环是允许对数组进行操作、检查各项以及对各项执行某种操作的构造。 但循环比数组迭代要多。 还可通过使用 Do-While 循环,有条件地继续运行循环。 有关详细信息,请参阅关于 Do

  • 错误处理。 对于脚本编写,可靠性以及处理各种类型错误的能力很重要。 需了解终止和非终止错误的区别。 你将使用 TryCatch 等构造。 我们将在本模块的最后一个概念单元中介绍此主题。

  • 表达式。 你将在 PowerShell 脚本中频繁使用表达式。 例如,创建自定义列或自定义排序表达式。 表达式是 PowerShell 语法中值的表示形式。

  • .NET 和 .NET Core 集成。 PowerShell 提供与 .NET 和 .NET Core 的强大集成。 此集成超出了本模块的范畴。

运行脚本

需要注意的是,某些脚本不安全。 如果在 Internet 上发现某脚本,则不应在计算机上运行它,除非你清楚地了解其功能。 即使使用你认为安全的脚本,也可能存在风险。 例如,假设有一个脚本,其功能是在测试环境中进行清理操作。 在生产环境中,该脚本可能存在风险。 如果脚本是由你或同事编写的,或者是从 Internet 获得的,则需要了解脚本的功能。

PowerShell 尝试通过两种主要方式阻止你执行意外操作:

  • 要求使用完整路径或相对路径来运行脚本。 运行脚本时,你始终需要提供脚本的路径。 提供路径有助于准确了解所运行的内容。 例如,计算机上可能有一些你不希望运行的命令和别名,但它们与脚本的名称相同。 包含路径可提供额外的检查,以确保准确运行要运行的内容。
  • 执行策略。 执行策略是一项安全功能。 就像要求脚本的路径一样,策略可以阻止执行意外操作。 可以在不同级别上设置策略,如本地计算机、当前用户或特定会话。 还可使用组策略设置为计算机和用户设置执行策略。

这两种机制不会阻止打开文件、复制其内容、将内容放置在文本文件中以及运行文件。 也不会阻止你通过控制台运行代码。 这些机制可帮助阻止执行意外操作。 它们不是安全系统。

创建和运行脚本:

  1. 创建如下所示的 PowerShell 语句,并将其保存在以“. ps1”结尾的文件中:

    # PI.ps1
    $PI = 3.14
    Write-Host "The value of `$PI is $PI"
    
  2. 通过脚本的名称和路径调用脚本来运行该脚本:

    备注

    在运行脚本之前,请确保当前 shell 为 PowerShell。 或者,在 Linux 或 macOS 上,可以将 shebang 放在脚本文件之上,将 PowerShell 定义为脚本解释器。

    ./PI.ps1
    

    建议在调用中包含文件扩展名,但这不是必需的。

执行策略

可以使用以下 cmdlet 来管理执行策略:

  • Get-ExecutionPolicy。 此 cmdlet 返回当前执行策略。 在 Linux 和 macOS 上,返回的值为 Unrestricted。 对于这些操作系统,不能更改此值。 这种限制不会降低 Linux 或 Mac 的安全性。 请记住,执行策略是一项安全功能,而不是一种安全机制。

  • Set-ExecutionPolicy。 如果使用的是 Windows 计算机,则可以使用此 cmdlet 更改执行策略的值。 它采用 -ExecutionPolicy 参数。 有多个可能的值。 建议将 Default 用作值。 该值在 Windows 客户端上将策略设置为 Restricted,在 Windows Server 上则设置为 RemoteSignedRestricted 表示无法运行脚本。 你只能运行命令,这在客户端上是说得通的。 RemoteSigned 表示可以运行在本地计算机上编写的脚本。 从 Internet 下载的脚本需要由受信任的发布者进行数字签名。

    备注

    还可以使用其他值。 若要了解详细信息,请参阅关于执行策略

变量

变量不仅仅用于脚本。 你还可以在控制台上定义它们。 可以将值存储在变量中,以便以后使用。 若要定义变量,请在其前面加上 $ 字符。 下面是一个示例:

$PI = 3.14

使用变量:引号和内插

通过 Write-HostWrite-Output 输出文本时,可以使用单引号或双引号。 你的选择取决于是否要内插值。 需了解的三种机制:

  • 单引号。 单引号指定文字;所写即所得。 下面是一个示例:

    Write-Host 'Here is $PI' # Prints Here is $PI
    

    若要进行内插,以解释并输出 $PI 的值,则需要使用双引号。

  • 双引号。 使用双引号时,将插入字符串中的变量:

    Write-Host "Here is `$PI and its value is $PI" # Prints Here is $PI and its value is 3.14
    

    这里存在两个问题。 反引号 (`) 使 $PI 的第一个实例免于被内插。 在第二个实例中,将内插值并写出该值。

  • $()。 还可在双引号内编写表达式。 若要执行该操作,请使用 $() 构造。 使用此构造的一种方法是对对象的属性进行内插。 下面是一个示例:

    Write-Host "An expression $($PI + 1)" # Prints An expression 4.14
    

作用域

范围是 PowerShell 定义读取变量、别名和函数等构造的位置的方式。 学习编写脚本时,需知道你所具备的访问权限、可以更改的内容以及可以更改的位置。 如果不了解范围的工作原理,代码可能无法按预期方式工作。

范围类型

下面讨论各个范围:

  • 全局范围。 在此范围内创建类似变量的构造时,它们会在会话结束后继续存在。 启动新的 PowerShell 会话时,出现的所有内容都可认为属于此范围。

  • 脚本范围。 运行脚本文件时,将创建脚本范围。 例如,在文件中定义的变量或函数就属于脚本范围。 文件完成运行后,它将不再存在。 例如,可以在脚本文件中创建一个变量,并以全局范围为目标。 但需要通过在变量前面加上关键字 global 来显式定义该范围。

  • 本地范围。 本地范围是当前范围,可以是全局范围或任何其他范围。

范围规则

范围规则有助于你了解在给定点可见的值。 它们还有助于了解如何更改值。

  • 范围可以嵌套。 范围可以具有父范围。 父范围是位于你所在范围之外的外部范围。 例如,本地范围可以将全局范围作为父范围。 相反,范围可以具有嵌套范围(也称为子范围)。

  • 项在当前范围和子范围中可见。 项(如变量或函数)在创建时所在的范围中可见。 默认情况下,它在任何子范围中也可见。 可以通过将项设为在范围内为专用来更改该行为。 下面是一个使用在控制台中定义的变量的示例:

    $test = 'hi'
    

    如果你有一个包含以下内容的“Script.ps1”文件,则在脚本运行时它将显示“hi”:

    Write-Host $test # Prints hi
    

    可以看到变量 $test 在本地范围及其子作范围(在本例中为脚本范围)中可见。

  • 只能在创建的范围内更改项。 默认情况下,只能在创建项的范围内更改该项。 可以通过显式指定一个不同的范围来更改此行为。

配置文件

配置文件是在 PowerShell 启动时运行的脚本。 可以使用配置文件自定义环境,例如,更改背景颜色和错误以及执行其他类型的自定义。 PowerShell 会将这些更改应用到启动的每个新会话。

配置文件类型

PowerShell 支持多个配置文件。 可以按如下所示在不同级别应用它们:

说明 路径
所有用户,所有主机 $PSHOME\Profile.ps1
所有用户,当前主机 $PSHOME\Microsoft.PowerShell_profile.ps1
当前用户,所有主机 $Home[My ]Documents\PowerShell\Profile.ps1
当前用户,当前主机 $Home[My ]Documents\PowerShell\Microsoft.PowerShell_profile.ps1

这里有两个变量:$PSHOME$Home$PSHOME 指向 PowerShell 的安装目录。 $Home 为当前用户的主目录。

其他程序也支持配置文件,如 Visual Studio Code。

创建档案

首次安装 PowerShell 时,没有配置文件,但有一个 $Profile 变量。 它是一个对象,指向应放置每个要应用的配置文件的路径。 创建配置文件:

  1. 确定要创建配置文件的级别。 可运行 $Profile | Select-Object * 来查看配置文件类型以及与它们关联的路径。

  2. 使用如下所示的命令选择配置文件类型并在其位置创建文本文件:New-Item -Path $Profile.CurrentUserCurrentHost

  3. 将自定义项添加到文本文件并保存。 下一次启动会话时,将应用所做的更改。