[英]How does pipeline and $_ work in PowerShell?
Get-Process|Get-Member $_
,為什么這不起作用? 如果$_
代表管道中的當前對象,則上述輸出不應該是每個流程對象的返回成員嗎? $_
變量? 創建此變量的條件將比僅使用cmdlet示例演示$_
的使用更為有用。 $_
是一個自動變量,可用於某些cmdlet的腳本塊輸入中,以表示管道中的當前項目。
Get-Process | Get-Member $_
Get-Process | Get-Member $_
不起作用,因為您通過|
將管道對象發送到Get-Member
|
,但是您將無法訪問Get-Member
的內部。
您可以這樣做:
Get-Process | ForEach-Object {
$_ | Get-Member
}
然后,對於Get-Process
輸出的對象集合中的每個項目,您將獲得Get-Member
輸出,盡管這將是多余的,因為每個對象都是相同的。
Cmdlet確實一次將對象向下發送到管道。 您可以通過以下示例看到這一點:
Get-Process | ForEach-Object {
$_
Start-Sleep 1
}
您可以看到延遲增加,結果一出現就一次到達ForEach-Object
。
其他地方,你可以使用$_
變量在Where-Object
和Select-Object
。 例如:
Get-Process | Where-Object { $_.name -like 'win*' }
在這里, Where-Object
cmdlet接受管道的每個項目,我們使用$_
訪問該項目的name屬性,以查看它是否類似於字符串win
。 如果是,則將其繼續發送(因此將其發送到控制台),否則, Where-Object
將其丟棄。
執行計算的屬性時,可以在Select-Object
使用$_
。 例如:
Get-Process | Select-Object name,@{N='WorkingSetGB';E={$_.WorkingSet / 1GB}}
在這里,我們使用$_
獲得每個項目的WorkingSet
屬性,然后使用/ 1GB
將其轉換為GB值。
是的, $_
代表管道中的當前對象,但是由於Get-Member接受管道輸入,因此您只需將結果通過管道傳遞到cmdlet:
Get-Process | Get-Member
另一個例子是
Get-Process | Export-Csv MyFile.csv
同樣,這里不需要$ _,因為Export-Csv接受管道輸入,並通過管道接收一次一個進程的Get-Process的輸出。 在Export-csv的實現內部有一個循環,但是這里不必關心您。
當將對象通過管道傳遞到ForEach-Object
cmdlet時,通常使用$_
:
Get-Process | ForEach-Object {
Write-Host $_.Name
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.