You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell自定义Out()函数为何仅返回管道最后一个对象?

解决PowerShell管道输入仅返回最后一个对象的问题

这个问题我太熟悉了!你的函数之所以只返回最后一个进程对象,是因为PowerShell处理管道输入的机制——当你没有显式定义process块时,函数里的代码默认会在end块中执行,而end块只会在所有管道对象都传递完毕后运行一次,这时候$Out变量已经被最后一个管道对象覆盖了。

修正后的函数代码

function Out() {
  [CmdletBinding()]
  [Alias()]
  Param(
    [Parameter(Mandatory=$false, ValueFromPipeline=$true, Position=0)]
    $Out
  )
  process {
    $Out
  }
}

为什么这样改?

PowerShell函数有三个核心执行块:

  • begin:在管道开始传递对象之前执行一次,适合做初始化操作
  • process:针对管道中的每一个对象都执行一次,这正是处理管道输入的关键
  • end:在所有管道对象处理完成后执行一次,适合做收尾工作

你的原函数没有定义任何块,代码默认属于end块,自然只会输出最后一个对象。把$Out的输出逻辑放到process块后,每个进程对象通过管道传递过来时,都会触发一次process块的执行,从而依次输出所有对象。

现在运行gps | Out,就能看到完整的进程列表啦!

内容的提问来源于stack exchange,提问作者Aso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:38:33