PowerShell 教程:PowerShell 脚本编写基础知识

插图:丽莎·霍农

Microsoft PowerShell(通常称为 Windows PowerShell)提供了一种方便的方法来自动执行各种杂务,无论您是在 Windows Server 还是 Windows 工作站上工作。

系统管理员最好学习这种脚本语言,将其作为自动化任务(尤其是重复性任务)的技能,并开发高级管理任务以帮助减轻工作负载并通过可预测的、经过验证的命令执行操作。这些命令可以在本地系统或使用 PowerShell 远程处理功能的远程系统上运行,例如,更新多个系统上的 Windows 注册表。

看:(科技共和国高级版)

PowerShell 与您习惯在 IDE 中使用的编程语言(例如 Visual Studio Code 又名 VS Code)不太一样。 PowerShell 变量、cmdlet、模块和提供程序是基础,构成了强大的 PowerShell 工具来帮助完成工作。

  • 变量是一个术语,用于标识特定值以便于引用和重用。
  • cmdlet 是内置的 PowerShell 命令(Get 命令 cmdlet 是最常见的命令之一,具有多种用途,例如检索现有设置或通过 get-help cmdlet 寻求帮助)。
  • 模块是包含多个对象(例如 cmdlet、变量等)的包。
  • 提供程序是一个 .NET 程序,它提供对注册表、别名、函数、变量、文件系统和整个操作系统环境等信息的访问。

Windows PowerShell 专门在 Windows 操作系统上运行,并由 PowerShell Core 进行了增强,PowerShell Core 是一个高级版本,能够以与 Visual Studio Code 相同的方式在 Windows、Mac 和 Linux 操作系统上运行。

这是一个 Windows PowerShell 脚本编写教程,旨在作为初学者指南,说明脚本编写基础知识,以帮助初学者开始使用现有的 Windows PowerShell 脚本或 PowerShell cmdlet 或构建新的脚本或 PowerShell cmdlet。

您可以从 Windows PowerShell 文件夹下的“开始”菜单启动 Windows PowerShell,以便熟悉本 PowerShell 教程的使用。要使用的两个程序是 Windows PowerShell 和 Windows PowerShell ISE(集成脚本环境)。第一个可执行文件是命令提示符界面,第二个是基于 GUI 的界面,如下所示:

我更喜欢使用 Windows PowerShell ISE 进行 PowerShell 脚本编写,因为它提供了一个允许使用命令提示符功能的 PowerShell 控制台窗口,以及一个方便的工具栏功能区和右侧列出的命令引用,您可以单击它们来插入 PowerShell 命令并了解有关它们的更多信息。

请注意,默认可执行文件是 64 位,但出于向后兼容的目的,可以在此文件夹中找到每个文件的 32 位 PowerShell 版本。

1.PS1文件

PowerShell 语法对于新手来说可能有点令人畏惧,所以让我们从脚本(也称为 PS1 文件)的基础知识开始。 Windows PowerShell 脚本实际上只不过是一个可以在 Windows PowerShell 或 Windows PowerShell ISE 中运行的简单文本文件。 PowerShell 脚本语言通过执行一系列 PowerShell 命令(或单个命令)来运行,每个命令显示在单独的行上。对于要被视为 PowerShell 脚本的文本文件,其文件名需要以 .PS1 结尾以表示 PowerShell 扩展名。

最简单、最基本的 PowerShell 示例是一个名为 Datecheck.ps1 的文件,其中包含以下条目:

Get-Date

运行此命令将为您提供类似于以下内容的输出:

Tuesday, May 10, 2022 3:20:04 pm

2、执行权限

为了防止执行恶意脚本,PowerShell 强制执行执行策略。默认情况下,执行策略设置为“受限”,这意味着 PowerShell 脚本将不会运行。您可以使用以下 cmdlet 确定当前的执行策略:

Get-ExecutionPolicy

您可以使用的执行策略有:

  • 受限制的– 脚本不会运行。
  • 远程签名–本地创建的脚本将运行,但从互联网下载的脚本将不会运行(除非它们由受信任的发布者进行数字签名)。
  • 全部签名– 脚本仅在经过可信发布者签名后才会运行。
  • 无限制–无论脚本来自何处以及是否经过签名,脚本都会运行。

您可以使用以下 cmdlet 设置 PowerShell 的执行策略:

Set-ExecutionPolicy <policy name>

注意:在 PowerShell 命令提示符中键入时,您可以输入部分命令,然后按 Tab 键自动填充其余部分(或显示与您输入的内容匹配的多个选项)。例如,输入 Set-Ex 并按 Tab 键将自动填充整个 Set-ExecutionPolicy 命令并节省您一些时间。

3. 运行脚本

多年来,如果您想从命令行运行可执行文件,做法是导航到文件的路径,然后键入可执行文件的名称。然而,这种古老的方法不适用于 PowerShell 脚本。

如果要执行 PowerShell 脚本,通常必须键入完整路径和文件名。例如,要运行名为 SCRIPT.PS1 的脚本,您可以键入:

C:\脚本\Script.ps1

最大的例外是,如果包含脚本的文件夹位于系统路径中,则只需键入脚本名称即可执行脚本。如果您已经位于包含脚本的文件夹中,还可以使用一个快捷方式。在这种情况下,您可以输入 .\ 和脚本名称,而不是输入脚本的完整路径。例如,您可以输入:

.\Script.ps1

4. 流水线

流水线是将一个命令的输出输入到另一个命令的术语。这允许第二个命令对其收到的输入进行操作。要通过管道传输两个命令(或 cmdlet),只需用管道符号 (|) 将它们分隔开。

为了帮助您了解管道的工作原理,假设您想要创建一个在服务器上运行的进程列表,并按进程 ID 号对该列表进行排序。您可以使用 Get-Process cmdlet 获取进程列表,但该列表不会排序。但是,如果将 cmdlet 的输出通过管道传输到 Sort-Object ID 命令中,则列表将被排序。使用的命令字符串如下所示:

Get-Process | Sort-Object ID

5. 变量

尽管您可以使用管道将一个命令的输出输入到另一个命令中,但有时仅靠管道无法完成工作。当您将一个命令的输出通过管道传输到另一个命令时,会立即使用该输出。有时,您可能需要将输出存储一段时间,以便稍后使用(或重复使用)。这就是 PowerShell 变量可以发挥作用的地方。

人们很容易将变量视为存储值的存储库,但在 PowerShell 中,变量可以存储命令的完整输出。例如,假设您要将服务器上运行的进程列表存储为变量。为此,您可以使用这行代码:

$a = Get-Process

这里,变量被命名为$a。如果您想使用该变量,只需按名称调用即可。例如,输入$a在屏幕上打印变量的内容。

您可以将变量分配给已通过管道连接在一起的多个命令的最终输出。只需用括号将命令括起来即可。例如,要按进程 ID 对正在运行的进程进行排序,然后将输出分配给变量,您可以使用以下命令:

$a = (Get-Process | Sort-Object ID)

运行“echo $a”将执行您分配给变量的命令。

6.@符号

通过使用@符号,您可以将列表的内容转换为数组。例如,采用以下代码行,它创建一个名为 $Procs 的变量,其中包含多行文本(一个数组):

$procs = @{name="explorer","svchost"}

您还可以在使用变量时使用 @ 符号,以确保将其视为数组而不是单个值。例如,下面的代码行将针对我刚才定义的变量运行 Get-Process cmdlet。这样做时,Windows 将显示 Windows 资源管理器和 Svchost 使用的所有进程。请注意变量名称前面如何使用 @ 符号,而不是我们通常看到的美元符号:

Get-Process @procs

7. 分裂

分割运算符根据您指定的字符分割文本字符串。例如,假设您要将一个句子分解为一个由句子中每个单词组成的数组。您可以使用如下命令来完成此操作:

"This is a test" -split " "

结果如下:

一个

测试

8. 加入

正如 split 可以将文本字符串拆分为多个部分一样,连接运算符可以将多个文本块合并为一个。例如,此行将创建一个由我的名字和姓氏组成的文本字符串:

"Scott","Matteson" -join " "

命令末尾引号之间的空格告诉 Windows 在两个文本字符串之间插入一个空格。

9. 断点

如果脚本包含错误,运行新创建的 PowerShell 脚本可能会产生意想不到的后果。保护自己的一种方法是在脚本中的战略位置插入断点。这样,您可以在处理整个事情之前确保脚本按预期工作。

插入断点的最简单方法是按行号。例如,要在脚本的第 10 行插入断点,您可以使用如下命令:

Set-PSBreakpoint -Script C:\Scripts\Script.ps1 -Line 10

您还可以将断点绑定到变量。因此,如果您希望脚本在 a$ 的内容发生更改时中断,您可以使用如下命令:

Set-PSBreakpoint -Script C:\scripts\Script.ps1 -variables a

请注意,我没有在变量名称后面包含美元符号。

PSBreakpoint 可以使用许多动词,包括 Get、Enable、Disable 和 Remove。

10. 步骤

调试脚本时,有时可能需要逐行运行脚本。为此,您可以使用 PowerShell ISE 中的单步执行过程来使脚本在每行之后暂停,无论断点是否存在。使用概述的功能在下表中.

图片:微软