PowerShell管道概念如何工作?

Ric*_*ard 9 powershell pipeline conceptual

我了解PowerShell管道通过获取一个cmdlet的输出并将其作为输入传递给另一个cmdlet来工作.但是这样做怎么样?

第一个cmdlet是否完成,然后一次传递所有输出变量,然后由下一个cmdlet处理?

或者,第一个cmdlet的每个输出是一次一个,然后通过所有剩余的管道cmdlet运行?

Kei*_*ill 12

您可以通过简单的脚本查看管道订单的工作原理:

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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)


S N*_*ash 6

Powershell管道以异步方式工作.这意味着第一个cmdlet的输出可以立即用于第二个cmdlet一个对象(即使第一个cmdlet尚未完成执行).

例如,如果您运行以下行:

dir -recurse| out-file C:\a.txt
Run Code Online (Sandbox Code Playgroud)

然后按Control + C停止执行,您将看到目录的一部分写入文本文件.

一个更好的例子是以下代码:(这对于删除驱动器c上的所有.tmp文件确实很有用:)

get-childitem c:\ -include *.tmp -recurse | foreach ($_) {remove-item $_.fullname}
Run Code Online (Sandbox Code Playgroud)

每次第二个cmdlet中的$ _获取a(单个文件)的值