如何在PowerShell筛选器中调用另一个筛选器的Begin/Process/End块
如何在PowerShell筛选器中分步调用另一个筛选器的Begin/Process/End块
正确实现代码
要实现你的需求,需要使用PowerShell的GetSteppablePipeline()方法手动控制目标筛选器的生命周期,以下是符合要求的筛选器Y实现:
filter Y([Parameter(ValueFromPipeline)]$o) { begin { Write-Host "Begin Y" # 获取筛选器X的可分步执行管道对象 $steppablePipe = { X }.GetSteppablePipeline($MyInvocation.CommandOrigin) # 调用X的Begin块 $steppablePipe.Begin($true) } process { # 将当前输入对象传入X的Process块 $steppablePipe.Process($o) } end { # 调用X的End块 $steppablePipe.End() Write-Host "End Y" } }
原实现不符合要求的原因
你原来的代码中,在Y的process块里执行$o | X,相当于每次处理一个输入对象时都会启动一个全新的X筛选器实例,因此每个对象都会触发X的Begin和End块,导致多次输出Begin X和End X。
原理说明
GetSteppablePipeline()方法可以将包含目标命令的脚本块转换为可分步执行的管道对象,这个对象提供了Begin()、Process()、End()三个方法,让你可以精确控制目标筛选器X的各个生命周期块的执行时机:
- 在Y的
begin块中调用$steppablePipe.Begin($true),只会触发一次X的Begin块 - 在Y的
process块中调用$steppablePipe.Process($o),将每个输入对象传入X的Process块处理 - 在Y的
end块中调用$steppablePipe.End(),只会触发一次X的End块
验证结果
运行0..3 | Y后,输出与期望完全一致:
Begin Y Begin X |0| |1| |2| |3| End X End Y
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

