如何在 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] } }
) 只顯示消息的第一行,以提高可讀性。
通過使用逗號將這個命令拆分為多行,我們使腳本更加可讀,特別是在處理多個屬性或複雜表達式時。
輸出:
使用花括號({}
)拆分長行程式碼
此外,當定義腳本塊時,花括號({}
)將允許直接進行行延續。在涉及循環、條件語句或將命令塊傳遞給 cmdlets 的情況下,這是必不可少的。
示例代碼:
$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