Перенаправить параметр конвейера в другую функцию, которая принимает конвейер - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть функция, которая принимает либо файл, либо вход конвейера. В случае файла я хочу обработать каждую строку определенным образом 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 внутри функции.

Стоит отметить, что я предпочел бы не необходимость «вспомнить» все входы конвейера, чтобы передать их обратно в другую функцию конвейера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...