如何在 PowerShell 中将命令拆分为多个行

  1. Windows PowerShell 多行命令
  2. 使用特定运算符拆分长代码行
  3. 结论
如何在 PowerShell 中将命令拆分为多个行

可读性强的代码能够非常容易地向用户传达其功能目的。变量名和方法名应具备适当的命名规范,以提升代码的可读性。

其他提高代码可读性的属性包括一致的缩进和格式化风格。Windows PowerShell 多行命令有助于将长命令行拆分为多个语句以提高可读性。

在 Windows PowerShell 中,可以使用反引号字符轻松创建多行命令,以将长的或单行命令拆分为多行语句。

反引号字符作为一种转义字符使用。它转义换行符并导致行的延续。

本文将解释 Windows PowerShell 多行命令的重要性,以便将长命令拆分为多行。

Windows PowerShell 多行命令

要将长命令分成多行,请使用反引号字符将其拆分为多行。

例如,我们想获取本地计算机上的可用磁盘空间信息。不幸的是,获取这一特定信息的脚本是一个较长的命令,难以阅读和管理。

示例代码:

Get-WmiObject -Class win32_logicaldisk | Format-Table DeviceId, MediaType, @{n = "Size"; e = { [math]::Round($_.Size / 1GB, 2) } }, @{n = "FreeSpace"; e = { [math]::Round($_.FreeSpace / 1GB, 2) } }

在本文中,它看起来像是语法被拆分了,但是当复制到命令行接口时,上述示例是非常长的一行脚本。

我们可以使用 Windows PowerShell 反引号字符轻松地将长命令拆分为多行。

示例代码:

Get-WmiObject -Class win32_logicaldisk `
| Format-Table DeviceId, `MediaType, @{n = "Size"; e = { [Math]::Round($_.Size / 1GB, 2) } }, `
@{n = "FreeSpace"; e = { [Math]::Round($_.FreeSpace / 1GB, 2) } }

在我们的代码中,我们利用反引号作为 PowerShell 中的行延续字符,通过将长命令拆分为多行来增强可读性。我们开始使用 Get-WmiObject -Class win32_logicaldisk,该命令获取系统上逻辑磁盘的信息。

这一行末尾的反引号表示命令在下一行继续。然后我们将输出通过管道 (|) 发送到 Format-Table,这是一个将输出格式化为表格的 cmdlet。

在这里,我们特别选择显示 DeviceIdMediaType。对于 SizeFreeSpace 属性,我们使用计算字段(通过 @{n = "Name"; e = { Expression }} 语法注记)。

在这些计算字段中,我们再次使用反引号进行行延续。表达式使用 [Math]::Round($*.Size / 1GB, 2)[Math]::Round($*.FreeSpace / 1GB, 2) 将大小和可用空间从字节转换为千兆字节,并分别四舍五入到小数点后两位。

通过使用反引号将这个复杂的命令拆分,我们使得脚本更易于管理,意图更明确,从而有助于其维护和可读性。

输出:

PowerShell 多行命令 - 输出 1

使用多行命令,代码结构在 Windows PowerShell 中易于阅读和维护。然而,反引号字符通常不被推荐,因为该字符难以阅读并容易引起错误。

因此,我们有另一种拆分长代码行的方法。

使用特定运算符拆分长代码行

PowerShell 在行延续方面很直观。某些运算符和语法结构固有地向解释器发出命令跨越多行的信号。

这在复杂脚本中特别有用,因为可读性可能显著影响维护和理解的难易程度。

使用管道 (|) 拆分长代码行

通常,当命令在该点无法按语法完成时,您将自动获得行延续。

一个示例是开始新的管道元素 (|)。由于在管道运算符之后,命令由于缺少另一个管道元素而无法完成,因此管道将正常工作。

所以,我们的解释器会在下一行命令中查找下一个管道元素。

示例代码:

Get-Process |
    Where-Object { $_.ProcessName -like "powershell" } |
    Select-Object Id, ProcessName, CPU

在我们的脚本中,我们以 Get-Process 开始,它检索当前正在运行的所有进程。Get-Process 的输出然后通过管道传递给 Where-Object,我们在这里过滤出名称包含 powershell 的进程。

这是通过在脚本块 {} 中使用 -like 运算符来匹配进程名称实现的。

接着,我们将过滤的结果通过管道传递给 Select-Object。在这里,我们指定只保留这些过滤进程的 IdProcessNameCPU 使用情况。

通过使用管道,我们有效地将命令分解为可管理的部分,每个部分在单独的行上。这不仅使我们的脚本更具可读性,也简化了调试和未来的修改。

输出:

powershell 多行命令 - 输出 2

使用逗号 (,) 拆分长代码行

逗号 (,) 在某些上下文中也可以工作,就像管道运算符一样。

在某些上下文中,例如在命令或脚本块内,逗号运算符也可以作为行延续信号。这在格式化命令或传递项列表时特别有用。

示例代码:

Get-EventLog -LogName Application -Newest 5 |
    Format-Table TimeGenerated, 
    EntryType, 
    Source, 
    @{n = 'Message'; e = { $_.Message.Split("`n")[0] } }

在我们的脚本中,我们使用 Get-EventLog 从应用程序日志中获取最新的 5 条条目。此输出被管道传递给 Format-Table 进行格式化。

然后我们使用逗号方法列出我们希望在表中显示的属性:TimeGeneratedEntryTypeSource 和一个自定义表达式用于 MessageMessage 的自定义表达式使用计算属性 (@{n='Message'; e= { $_.Message.Split("n")[0] } }) 只显示消息的第一行,从而提高可读性。

通过使用逗号将该命令拆分为多行,我们使脚本的可读性得到了提升,特别是在处理多个属性或复杂表达式时。

输出:

powershell 多行命令 - 输出 3

使用花括号 ({}) 拆分长代码行

此外,花括号 ({}) 在定义脚本块时将允许直接进行行延续。在涉及循环、条件语句或将命令块传给 cmdlet 的场景中,它们是不可或缺的。

示例代码:

$processes = Get-Process
$filteredProcesses = $processes | Where-Object {
    $_.WorkingSet -gt 100MB
} | ForEach-Object {
    $_.ProcessName
}
$filteredProcesses

我们开始使用 Get-Process cmdlet 获取所有进程的列表。然后通过管道将这些进程传递给 Where-Object,在这里脚本块过滤出工作集大于 100MB 的进程。

存活的进程被传递到 ForEach-Object 中的另一个脚本块,该脚本块提取并输出它们的名称。使用花括号作为脚本块允许数据在管道中以清晰、简洁和功能性的方式流动。

输出:

powershell 多行命令 - 输出 4

结论

在本文中,我们探讨了增强 PowerShell 脚本可读性的各种方法。可读性对于易于理解和维护脚本至关重要,特别是在 Windows PowerShell 中,脚本通常可能变得冗长和复杂。

我们首先讨论了使用反引号字符进行多行命令的常见做法,这种方法虽然有效,但有时可能导致可读性问题和潜在的错误,因为它的微妙性质。

然而,PowerShell 提供了更直观的拆分长代码行的方法,我们随后对此进行了探讨。像管道 (|)、逗号 (,) 和花括号 ({}) 等特定运算符的使用,为脚本编写提供了一种更可读和可维护的方法。

这些方法不仅改善了代码的视觉结构,还增强了逻辑流,使得脚本更容易调试和修改。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn