簡體   English   中英

管道和$ _在PowerShell中如何工作?

[英]How does pipeline and $_ work in PowerShell?

  1. Get-Process|Get-Member $_ ,為什么這不起作用? 如果$_代表管道中的當前對象,則上述輸出不應該是每個流程對象的返回成員嗎?
  2. cmdlet會一次或在有可用對象時立即將其所有輸出對象傳遞到下一個cmdlet嗎?
  3. 由於#1不起作用,我什么時候可以使用$_變量? 創建此變量的條件將比僅使用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-ObjectSelect-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM