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
相关产品推荐
相关产品推荐

