簡體   English   中英

PowerShell管道概念如何工作?

[英]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.

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