如何在 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。
在这里,我们特别选择显示 DeviceId
和 MediaType
。对于 Size
和 FreeSpace
属性,我们使用计算字段(通过 @{n = "Name"; e = { Expression }}
语法注记)。
在这些计算字段中,我们再次使用反引号进行行延续。表达式使用 [Math]::Round($*.Size / 1GB, 2)
和 [Math]::Round($*.FreeSpace / 1GB, 2)
将大小和可用空间从字节转换为千兆字节,并分别四舍五入到小数点后两位。
通过使用反引号将这个复杂的命令拆分,我们使得脚本更易于管理,意图更明确,从而有助于其维护和可读性。
输出:
使用多行命令,代码结构在 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
。在这里,我们指定只保留这些过滤进程的 Id
、ProcessName
和 CPU
使用情况。
通过使用管道,我们有效地将命令分解为可管理的部分,每个部分在单独的行上。这不仅使我们的脚本更具可读性,也简化了调试和未来的修改。
输出:
使用逗号 (,
) 拆分长代码行
逗号 (,
) 在某些上下文中也可以工作,就像管道运算符一样。
在某些上下文中,例如在命令或脚本块内,逗号运算符也可以作为行延续信号。这在格式化命令或传递项列表时特别有用。
示例代码:
Get-EventLog -LogName Application -Newest 5 |
Format-Table TimeGenerated,
EntryType,
Source,
@{n = 'Message'; e = { $_.Message.Split("`n")[0] } }
在我们的脚本中,我们使用 Get-EventLog
从应用程序日志中获取最新的 5 条条目。此输出被管道传递给 Format-Table
进行格式化。
然后我们使用逗号方法列出我们希望在表中显示的属性:TimeGenerated
、EntryType
、Source
和一个自定义表达式用于 Message
。Message
的自定义表达式使用计算属性 (@{n='Message'; e= { $_.Message.Split("n")[0] } }
) 只显示消息的第一行,从而提高可读性。
通过使用逗号将该命令拆分为多行,我们使脚本的可读性得到了提升,特别是在处理多个属性或复杂表达式时。
输出:
使用花括号 ({}
) 拆分长代码行
此外,花括号 ({}
) 在定义脚本块时将允许直接进行行延续。在涉及循环、条件语句或将命令块传给 cmdlet 的场景中,它们是不可或缺的。
示例代码:
$processes = Get-Process
$filteredProcesses = $processes | Where-Object {
$_.WorkingSet -gt 100MB
} | ForEach-Object {
$_.ProcessName
}
$filteredProcesses
我们开始使用 Get-Process
cmdlet 获取所有进程的列表。然后通过管道将这些进程传递给 Where-Object
,在这里脚本块过滤出工作集大于 100MB
的进程。
存活的进程被传递到 ForEach-Object
中的另一个脚本块,该脚本块提取并输出它们的名称。使用花括号作为脚本块允许数据在管道中以清晰、简洁和功能性的方式流动。
输出:
结论
在本文中,我们探讨了增强 PowerShell 脚本可读性的各种方法。可读性对于易于理解和维护脚本至关重要,特别是在 Windows PowerShell 中,脚本通常可能变得冗长和复杂。
我们首先讨论了使用反引号字符进行多行命令的常见做法,这种方法虽然有效,但有时可能导致可读性问题和潜在的错误,因为它的微妙性质。
然而,PowerShell 提供了更直观的拆分长代码行的方法,我们随后对此进行了探讨。像管道 (|
)、逗号 (,
) 和花括号 ({}
) 等特定运算符的使用,为脚本编写提供了一种更可读和可维护的方法。
这些方法不仅改善了代码的视觉结构,还增强了逻辑流,使得脚本更容易调试和修改。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn