我是 PowerShell 新手。
最近遇到一个问题,如何级联命令或函数。我找到了两种方法:
CMD_B (CMD_A ($x))
$x | CMD_A | CMD_B
但是,以上两种方式有什么区别呢?
例如,
Write-Output (Get-Process)
和Get-Process | Wirte-Output
的结果看起来是一样的。是否隐藏着不同的细节?
我搜索了有关 分组运算符
()
和 管道运算符 |
的文档,并找到:
当用作管道的第一段时,将命令或表达式括在括号中总是会导致表达式结果的枚举。如果括号包含一个命令,则该命令将运行至完成,并在通过管道发送结果之前将所有输出收集在内存中。
在管道传输之前对表达式进行分组还可以确保后续的逐个对象处理不会干扰命令用于生成其输出的枚举。
但是我不太明白。也许是因为我缺乏管道的基础知识。
提前致谢。
从基础开始,
Write-Output (Get-Process)
与将 Get-Process
的输出存储在变量中并将其作为参数传递给 Write-Output
相同。当您使用 (...)
时,必须首先计算表达式 ,然后后续命令接收该输出,这可能意味着更高的内存消耗。
使用管道,您所拥有的是一次处理,只要管道中的前一个开始输出,后续命令就会接收并处理一次一个项目。
如果在每个输出对象之间添加一点延迟,(...)
和管道之间的比较很容易看出:
function Test-ProcessingFunction {
param(
[Parameter(ValueFromPipeline)]
[int[]] $int
)
process {
foreach ($i in $int) {
"Processing $i"
}
}
}
$rangeDelayed = {
0..10 | ForEach-Object { Start-Sleep -Milliseconds 200; $_ }
}
# nothing happens until `$rangeDelayed` finishes
Test-ProcessingFunction (& $rangeDelayed)
# as soon as `$rangeDelayed` outputs, it gets processed
& $rangeDelayed | Test-ProcessingFunction