PowerShell 中的管道變數
我們通常使用 this
變數或關鍵字來表示各種程式語言中表示式中出現的最後一個物件。當我們想要無縫地編寫指令碼時,這種編寫指令碼的常用方法很方便。
本文將向我們展示如何通過使用 PowerShell 的 pipeline
變數在 Windows PowerShell 中使用相同的概念和技術。
瞭解 PowerShell 中的管道變數 $_
或 $PSItem
Windows PowerShell 有一個唯一的管道變數 $_
或 $PSItem
。需要 Windows PowerShell 將整個物件從一個命令傳送到另一個命令的能力,以表示該物件遍歷管道。
當一個 Windows PowerShell cmdlet 將某些內容通過管道傳遞給另一個命令時,該 cmdlet 可以傳送一個物件。
物件可以是任何型別。該物件具有一組附加的方法和屬性。
我們可以在獨立物件上引用這些技術和屬性,方法是建立物件本身,將其分配給新宣告的變數,然後以這種方式引用其屬性和方法。
例如,查詢目錄時,Get-Item
cmdlet 返回 System.IO.DirectoryInfo
物件。
Get-Item -Path 'C:\Windows' | Get-Member
然後,該物件具有許多我們可以參考的不同技術和屬性。因此,例如,我們可以呼叫此物件的方法或引用其屬性。
$windowsDir.GetFiles()
但是,如果我們使用像 Get-ChildItem
這樣的 cmdlet,它會同時列舉許多目錄呢?分配諸如 $dir1
、dir2
和 $dir3
之類的變數將具有挑戰性。
我們需要一種更動態的方式來將它們設定在一個變數中,該變數表示處理時的每個目錄物件。因此,我們需要在這個用例中使用 pipeline
變數。
使用 Get-ChildItem
示例,假設我們要使用 Get-ChildItem -Path C:\Windows\ -Directory
查詢 C:\Windows
目錄中的所有資料夾和子資料夾。
此 cmdlet 返回幾十個目錄。如果我們將此輸出分配給一個變數,它將是一個物件陣列,而不僅僅是一個物件。
因此,我們可以將所有這些物件一次一個地從 Get-ChildItem
cmdlet 傳遞到 ForEach-Object
cmdlet 並呼叫管道變數。
管道變數 $_
或 $PSItem
在處理每個物件時引用它。
例如,在下面,我們可以看到我們可以為使用 $_.Name
變數處理的每個目錄引用 Name
屬性。
Get-ChildItem -Path C:\Windows\ -Directory | ForEach-Object { $_.Name }
輸出:
addins
ADFS
appcompat
AppPatch
AppReadiness
assembly
使用管道變數,我們可以表示任何方法和屬性。該變數將始終與上一個命令中的物件具有相同的型別。
例如,我們可以在下面看到,如果你將管道變數本身處理為 Get-Member
,它會返回與 Get-Item
相同的物件型別。
Get-ChildItem -Path C:\Windows\ -Directory | ForEach-Object { $_ | Get-member } | Select-Object -First 1
輸出:
TypeName: System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
LinkType CodeProperty System.String LinkType{get=GetLinkType;}
我們將看到在引用或對每個處理的物件執行特定操作的命令中最常使用的管道變數。另一個例子是使用 Select-Object
命令的計算屬性。
此方法允許指令碼編寫者操作通過表示來自管道的物件返回的輸出。
例如,我們可以使用計算屬性動態建立一個 DirectoryName
屬性並將目錄名稱分配給它,而不是使用 ForEach-Object
命令只返回目錄名稱。
Get-ChildItem -Path C:\Windows\ -Directory | Select-Object -Property @{ Name = 'DirectoryName'; Expression = { $_.Name } }
輸出:
DirectoryName
-------------
addins
ADFS
appcompat
AppPatch
AppReadiness
assembly
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn