在 Powershell 高级函数中,如何检测 BEGIN 块中的管道输入?

Pau*_*ore 3 powershell pipeline function

我有高级功能

function Start-Executable {
    [CmdletBinding()]
    Param (
        [String]$Arg1,
        [String[]]$Arg2,
        [Parameter(ValueFromPipeline=$true)][String[]]$PipeValue
    )

Begin {
    # Setup code
}
Process {
    # What goes on here?
    foreach ($val in $PipeValue) {
        # Process val here
    }
}
End {
}
}
Run Code Online (Sandbox Code Playgroud)

在我的设置代码中,我需要根据用户是否提供管道输入来做一些不同的事情。但是我不知道如何在 BEGIN 块中判断是否有管道输入。有什么我可以检查的吗?

我尝试的另一件事是在循环之前将设置代码放在 PROCESS 块中,$PipeValue但这不起作用,因为似乎为每个管道值调用一次 PROCESS 块,每次$PipeValue都是一个项目的数组. 那正确吗?如果为每个值重复调用 PROCESS,为什么我需要在 PROCESS 块内进行另一个循环?

更新

澄清一下,我想要做的是在 BEGIN 中创建一个进程,在 PROCESS 中输入它并在 END 中读取输出。为此,我需要设置RedirectStandardInput$true是否有管道输入,否则不设置。

作为变通方法,我可以让用户指定一个额外的参数(如果他们弄错了,事情就不起作用),或者我可以$first_time在 BEGIN 中设置一个标志,然后在第一次调用 PROCESS 时创建进程。如果我在没有创建进程的情况下到达 END,我会在那里创建它RedirectStandardInputas $false。这比我喜欢的代码重复要多,但如果这是唯一的选择,我可能不得不这样做。

Pyp*_*hly 12

$MyInvocation.ExpectingInput 如果使用管道输入调用函数,则返回 true,否则返回 false。

这部作品在beginprocessend块。它不适dynamicparam 用于 PowerShell 5.1 或更低版本


mjo*_*nor 4

Begin 块在管道启动之前运行,因此该代码无法知道管道中的内容。

至于在 Process 块内需要另一个循环,如果函数需要接受任何 $PipeValue 作为管道输入或作为参数传递,则必须这样做。如果它只接受作为管道数据,那么为其提供参数是没有意义的。只需在进程块内使用 $_ 即可。