繁体   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