我了解到,使用begin/ process /end,流程部分对管道中的每个对象运行多次。所以如果我有这样的功能:
function Test-BeginProcessEnd {
[cmdletbinding()]
Param(
[Parameter(Mandatory=$true, ValueFromPipeline=$True)]
[string]$myName
)
begin {}
process {
Write-Host $myName
}
end {}
}我可以向它输送一个数组,就像这样,它处理每个对象:
PS C:\> @('aaa','bbb') | Test-BeginProcessEnd
aaa
bbb
PS C:\>但是,如果我试图在命令行中使用这个参数,我只能传递它一个字符串,所以我可以:
PS C:\> Test-BeginProcessEnd -myName 'aaa'
aaa
PS C:\>但我做不到:
PS C:\> Test-BeginProcessEnd -myName @('aaa','bbb')
Test-BeginProcessEnd : Cannot process argument transformation on parameter 'myName'. Cannot convert value to type
System.String.
At line:1 char:30
+ Test-BeginProcessEnd -myName @('aaa','bbb')
+ ~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Test-BeginProcessEnd], ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Test-BeginProcessEnd
PS C:\>显然,我希望参数用法与通过管道使用的参数相同,因此我必须将函数更改为:
function Test-BeginProcessEnd
{
[cmdletbinding()]
Param(
[Parameter(Mandatory=$true, ValueFromPipeline=$True)]
[string[]]$myNames
)
begin {}
process {
foreach ($name in $myNames) {
Write-Host $name
}
}
end {}
}因此,无论如何,我不得不使用foreach,而Process部分的循环功能并没有帮助我。
我错过了什么吗?我看不出它有什么用!谢谢你的帮助。
发布于 2018-01-19 18:44:20
BEGIN-PROCESS-END结构用于脚本/高级函数,其中(a)您希望能够将数据输送到它,(b)在处理整个数据集之前(BEGIN)和/或(END)之后(相对于管道中的每个单独项之前或之后),您想要做的事情。如果将单个值传递给使用foreach处理数组的高级函数,则它将单个值视为一个项的数组;管道实际上是这样做的--但对于管道,它不需要重新加载每个项的cmdlet。这就是为什么您可以编写脚本/高级函数,这些脚本/高级函数可以在管道中使用,也可以作为“独立”进程使用。这并不是因为PROCESS导致循环,而是因为它能够有效地处理从管道中输入的值。如果您想处理管道以外传递给它的多个值,您需要自己管理循环--正如您已经发现的那样。
https://stackoverflow.com/questions/48347560
复制相似问题