1、编写脚本简介
编写 PowerShell 脚本是指用 PowerShell 语言编写一组语句并将这些语句存储在文本文件中。 为什么要这样做? 使用 PowerShell 一段时间后,你会发现自己会重复某些任务,如生成日志报告或管理用户。 如果经常重复某些操作,最好是将其自动化:将其存储为便于重复使用的方式。
自动执行任务的步骤通常包括对 cmdlet、函数、变量等内容的调用。 若要存储这些步骤,你需要创建以“.ps1”结尾的文件并保存。 然后,你将拥有一个可运行的脚本。
开始学习脚本之前,让我们先大致了解一下 PowerShell 脚本语言的功能:
- 变量。 你可以使用变量来存储值。 还可以将变量用作命令的参数。
- 函数。 函数是语句的命名列表。 函数生成在控制台中显示的输出。 还可以将函数用作其他命令的输入。
许多使用 PowerShell 执行的任务都涉及对系统状态(本地或其他)的副作用或修改。 通常,输出是次要问题(例如报告数据)。 - 流控制。 流控制是通过使用
If
、ElseIf
和Else
之类的构造来控制各种执行路径的方法。 - 循环。 循环是允许对数组进行操作、检查各项以及对各项执行某种操作的构造。 但循环比数组迭代要多。 还可通过使用
Do-While
循环,有条件地继续运行循环。 有关详细信息,请参阅关于 Do。 - 错误处理。 对于脚本编写,可靠性以及处理各种类型错误的能力很重要。 需了解终止和非终止错误的区别。 你将使用
Try
和Catch
等构造。 我们将在本模块的最后一个概念单元中介绍此主题。 - 表达式。 你将在 PowerShell 脚本中频繁使用表达式。 例如,创建自定义列或自定义排序表达式。 表达式是 PowerShell 语法中值的表示形式。
- .NET 和 .NET Core 集成。 PowerShell 提供与 .NET 和 .NET Core 的强大集成。 此集成超出了本模块的范畴。
2、运行脚本
需要注意的是,某些脚本不安全。 如果在 Internet 上发现某脚本,则不应在计算机上运行它,除非你清楚地了解其功能。 即使使用你认为安全的脚本,也可能存在风险。 例如,假设有一个脚本,其功能是在测试环境中进行清理操作。 在生产环境中,该脚本可能存在风险。 如果脚本是由你或同事编写的,或者是从 Internet 获得的,则需要了解脚本的功能。
PowerShell 尝试通过两种主要方式阻止你执行意外操作:
- 要求使用完整路径或相对路径来运行脚本。 运行脚本时,你始终需要提供脚本的路径。 提供路径有助于准确了解所运行的内容。 例如,计算机上可能有一些你不希望运行的命令和别名,但它们与脚本的名称相同。 包含路径可提供额外的检查,以确保准确运行要运行的内容。
- 执行策略。 执行策略是一项安全功能。 就像要求脚本的路径一样,策略可以阻止执行意外操作。 可以在不同级别上设置策略,如本地计算机、当前用户或特定会话。 还可使用组策略设置为计算机和用户设置执行策略。
这两种机制不会阻止打开文件、复制其内容、将内容放置在文本文件中以及运行文件。 也不会阻止你通过控制台运行代码。 这些机制可帮助阻止执行意外操作。 它们不是安全系统。
创建和运行脚本:
- 创建如下所示的 PowerShell 语句,并将其保存在以“. ps1”结尾的文件中:PowerShell
# PI.ps1
$PI = 3.14
Write-Host "The value of `$PI is $PI"
- 通过脚本的名称和路径调用脚本来运行该脚本:
在运行脚本之前,请确保当前 shell 为 PowerShell。 或者,在 Linux 或 macOS 上,可以将 shebang 放在脚本文件之上,将 PowerShell 定义为脚本解释器。
Bash
./PI.ps1
建议在调用中包含文件扩展名,但这不是必需的。
3、执行策略
可以使用以下 cmdlet 来管理执行策略:
Get-ExecutionPolicy
。 此 cmdlet 返回当前执行策略。 在 Linux 和 macOS 上,返回的值为Unrestricted
。 对于这些操作系统,不能更改此值。 这种限制不会降低 Linux 或 Mac 的安全性。 请记住,执行策略是一项安全功能,而不是一种安全机制。Set-ExecutionPolicy
。 如果使用的是 Windows 计算机,则可以使用此 cmdlet 更改执行策略的值。 它采用-ExecutionPolicy
参数。 有多个可能的值。 建议将Default
用作值。 该值在 Windows 客户端上将策略设置为Restricted
,在 Windows Server 上则设置为RemoteSigned
。Restricted
表示无法运行脚本。 你只能运行命令,这在客户端上是说得通的。RemoteSigned
表示可以运行在本地计算机上编写的脚本。 从 Internet 下载的脚本需要由受信任的发布者进行数字签名。
还可以使用其他值。 若要了解详细信息,请参阅关于执行策略。
4、变量
变量不仅仅用于脚本。 你还可以在控制台上定义它们。 可以将值存储在变量中,以便以后使用。 若要定义变量,请在其前面加上 $
字符。 下面是一个示例:
PowerShell
$PI = 3.14
5、使用变量:引号和内插
通过 Write-Host
或 Write-Output
输出文本时,可以使用单引号或双引号。 你的选择取决于是否要内插值。 需了解的三种机制:
- 单引号。 单引号指定文字;所写即所得。 下面是一个示例:PowerShell
Write-Host 'Here is $PI' # Prints Here is $PI
若要进行内插,以解释并输出 $PI
的值,则需要使用双引号。
- 双引号。 使用双引号时,将插入字符串中的变量:PowerShell
Write-Host "Here is `$PI and its value is $PI" # Prints Here is $PI and its value is 3.14
这里存在两个问题。 反引号 (`) 使 $PI
的第一个实例免于被内插。 在第二个实例中,将内插值并写出该值。
$()
。 还可在双引号内编写表达式。 若要执行该操作,请使用$()
构造。 使用此构造的一种方法是对对象的属性进行内插。 下面是一个示例:PowerShell
Write-Host "An expression $($PI + 1)" # Prints An expression 4.14
6、作用域
范围是 PowerShell 定义读取变量、别名和函数等构造的位置的方式。 学习编写脚本时,需知道你所具备的访问权限、可以更改的内容以及可以更改的位置。 如果不了解范围的工作原理,代码可能无法按预期方式工作。
范围类型
下面讨论各个范围:
- 全局范围。 在此范围内创建类似变量的构造时,它们会在会话结束后继续存在。 启动新的 PowerShell 会话时,出现的所有内容都可认为属于此范围。
- 脚本范围。 运行脚本文件时,将创建脚本范围。 例如,在文件中定义的变量或函数就属于脚本范围。 文件完成运行后,它将不再存在。 例如,可以在脚本文件中创建一个变量,并以全局范围为目标。 但需要通过在变量前面加上关键字
global
来显式定义该范围。 - 本地范围。 本地范围是当前范围,可以是全局范围或任何其他范围。
7、范围规则
范围规则有助于你了解在给定点可见的值。 它们还有助于了解如何更改值。
- 范围可以嵌套。 范围可以具有父范围。 父范围是位于你所在范围之外的外部范围。 例如,本地范围可以将全局范围作为父范围。 相反,范围可以具有嵌套范围(也称为子范围)。
- 项在当前范围和子范围中可见。 项(如变量或函数)在创建时所在的范围中可见。 默认情况下,它在任何子范围中也可见。 可以通过将项设为在范围内为专用来更改该行为。 下面是一个使用在控制台中定义的变量的示例:PowerShell
$test = 'hi'
如果你有一个包含以下内容的“Script.ps1”文件,则在脚本运行时它将显示“hi”:
PowerShell
Write-Host $test # Prints hi
可以看到变量 $test
在本地范围及其子作范围(在本例中为脚本范围)中可见。
- 只能在创建的范围内更改项。 默认情况下,只能在创建项的范围内更改该项。 可以通过显式指定一个不同的范围来更改此行为。
配置文件
配置文件是在 PowerShell 启动时运行的脚本。 可以使用配置文件自定义环境,例如,更改背景颜色和错误以及执行其他类型的自定义。 PowerShell 会将这些更改应用到启动的每个新会话。
8、配置文件类型
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。
9、创建档案
首次安装 PowerShell 时,没有配置文件,但有一个 $Profile
变量。 它是一个对象,指向应放置每个要应用的配置文件的路径。 创建配置文件:
- 确定要创建配置文件的级别。 可运行
$Profile | Select-Object *
来查看配置文件类型以及与它们关联的路径。 - 使用如下所示的命令选择配置文件类型并在其位置创建文本文件:
New-Item -Path $Profile.CurrentUserCurrentHost
。 - 将自定义项添加到文本文件并保存。 下一次启动会话时,将应用所做的更改。