如何在 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 以進行格式化。

然後我們使用逗號方法列出我們希望在表格中顯示的屬性:TimeGeneratedEntryTypeSourceMessage 的自定義表達式。Message 的自定義表達式使用計算屬性 (@{n='Message'; e= { $_.Message.Split("n")[0] } }) 只顯示消息的第一行,以提高可讀性。

通過使用逗號將這個命令拆分為多行,我們使腳本更加可讀,特別是在處理多個屬性或複雜表達式時。

輸出:

powershell 多行命令 - 輸出 3

使用花括號({})拆分長行程式碼

此外,當定義腳本塊時,花括號({})將允許直接進行行延續。在涉及循環、條件語句或將命令塊傳遞給 cmdlets 的情況下,這是必不可少的。

示例代碼:

$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