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。
这部作品在begin,process和end块。它不适dynamicparam 用于 PowerShell 5.1 或更低版本。
Begin 块在管道启动之前运行,因此该代码无法知道管道中的内容。
至于在 Process 块内需要另一个循环,如果函数需要接受任何 $PipeValue 作为管道输入或作为参数传递,则必须这样做。如果它只接受作为管道数据,那么为其提供参数是没有意义的。只需在进程块内使用 $_ 即可。
| 归档时间: |
|
| 查看次数: |
4515 次 |
| 最近记录: |