[英]How does the PowerShell Pipeline Concept work?
我了解PowerShell管道通過獲取一個cmdlet的輸出並將其作為輸入傳遞給另一個cmdlet來工作。 但是如何做呢?
第一個cmdlet是否完成,然后一次傳遞所有輸出變量,然后由下一個cmdlet處理?
或者,第一個cmdlet的每個輸出是一次一個,然后通過所有剩余的管道cmdlet運行?
您可以通過簡單的腳本查看管道訂單的工作原理:
function a {begin {Write-Host 'begin a'} process {Write-Host "process a: $_"; $_} end {Write-Host 'end a'}}
function b {begin {Write-Host 'begin b'} process {Write-Host "process b: $_"; $_} end {Write-Host 'end b'}}
function c { Write-Host 'c' }
1..3 | a | b | c
輸出:
begin a
begin b
process a: 1
process b: 1
process a: 2
process b: 2
process a: 3
process b: 3
end a
end b
c
Powershell管道以異步方式工作。 這意味着第一個cmdlet的輸出可以立即用於第二個cmdlet一個對象(即使第一個cmdlet尚未完成執行)。
例如,如果您運行以下行:
dir -recurse| out-file C:\a.txt
然后按Control + C停止執行,您將看到目錄的一部分寫入文本文件。
一個更好的例子是以下代碼:(這對於刪除驅動器c上的所有.tmp文件確實很有用:)
get-childitem c:\ -include *.tmp -recurse | foreach ($_) {remove-item $_.fullname}
每次第二個cmdlet中的$ _獲取a(單個文件)的值
這兩個答案都為您提供了一些關於流水線的好信息。 但是,還有更多要說的。
首先,為了直接解決您的問題,您提出了管道可能工作的兩種可能方式。 它們都是正確的...取決於管道兩側的cmdlet! 然而,管道應的工作方式更接近你的第二個概念:對象處理一個時間。 (雖然不能保證一個對象在下一個對象啟動之前會一直運行,因為管道中的每個組件都是異步的,正如S Nash所提到的那樣。)
那么我的意思是“它取決於你的cmdlet”? 如果您正在討論Microsoft提供的cmdlet,它們可能都會按預期工作,盡可能高效地傳遞每個對象通過管道。 但是如果你在談論你編寫的cmdlet,那么它取決於你如何編寫它們:編寫cmdlet就像編寫成功那樣無法正確進行流水線操作一樣容易!
有兩種主要的故障模式:
當然,您想要爭取的是在收到每個輸入后立即對其進行處理,並在確定后立即發出輸出。 有關所有這些內容的詳細示例,請參閱我在Just-Talk.com上發布的文章“PowerShell管道的Ins and Outs” 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.