У меня есть функция, которая принимает либо файл, либо вход конвейера. В случае файла я хочу обработать каждую строку определенным образом c, используя UsefulPipelineFunction
. В случае параметра конвейера я хочу применить тот же UsefulPipelineFunction
.
Есть ли способ "получить доступ" ко всему входу конвейера в теле функции, которая принимает конвейерный ввод? Я думаю, что аналогия похожа на скрипт программы / оболочки, который принимает стандартный поток ввода, но внутренне перенаправляет этот поток в другую программу, которая также принимает ввод из stdin.
Function UsefulPipelineFunction{
[cmdletbinding()]
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]
$pipelineInput
)
#skipping implementation details for brevity.
# assume this function does usful things, handling each incoming pipeline object
begin{... }
process{ ... }
end { ... }
}
Function FileOrPipeline{
[cmdletbinding()]
param(
[Parameter(Mandatory=$false, ValueFromPipeline=$true)]
[System.IO.FileInfo]
$File,
[Parameter(Mandatory=$false, ValueFromPipeline=$true)]
$pipelineInput
)
#skipping implementation details for brevity.
# assume this function does usful things, handling each incoming pipeline object
begin{
if($null -ne $Fill -and $MyInvocation.ExpectingInput){
throw "Expects a File parameter, or a pipelined input"
}
elseif($MyInvocation.ExpectingInput){
#This is where I want to redirect the pipeline
return $EntirePipeline | UsefulPipelineFunction
}elseif ($File) {
return Get-Content $File | UsefulPipelineFunction
}
}
process{
# I don't actually want to handle each pipelineInput individually
# instead I want to redirect the whole incoming pipeline to the
# UsefulPipelineFunction
}
#details omiitted for brevity
end { ... }
}
Я также понимаю, что вероятно, более логично c делать это перенаправление вне функции, например Get-PipelinedValues | UsefulPipelineFunction
или Get-Content $file | UsefulPipelineFunction
, и просто полностью пропустить FileOrPipeline
. Но в моем реальном приложении моя функция FileOrPipeline
на самом деле делает намного больше, чем этот пример, поэтому я хочу инкапсулировать ее логику c внутри функции.
Стоит отметить, что я предпочел бы не необходимость «вспомнить» все входы конвейера, чтобы передать их обратно в другую функцию конвейера.