【发布时间】:2015-04-21 13:32:16
【问题描述】:
我正在尝试创建一个可以按位置接收多个参数的函数,包括管道输入。
这是一个简单的测试函数:
function TestMultiplePositionalParameters
{
param
(
[Parameter(
Position=0,
Mandatory=$true)
]
[String]$FirstParam,
[Parameter(
Position=1,
Mandatory=$true,
ValueFromPipeline=$true)
]
[String]$SecondParam
)
begin
{
Write-Host '================================='
}
process
{
Write-Host '$FirstParam:' $FirstParam
Write-Host '$SecondParam:' $SecondParam
Write-Host ''
}
}
当我调用它时,它工作正常:
"Input1","Input2" | TestMultiplePositionalParameters 'ExplicitArgument'
结果:
=================================
$FirstParam: ExplicitArgument
$SecondParam: Input1
$FirstParam: ExplicitArgument
$SecondParam: Input2
但是,如果我更改从管道中获取值的参数:
function TestMultiplePositionalParameters
{
param
(
[Parameter(
Position=0,
Mandatory=$true,
ValueFromPipeline=$true)
]
[String]$FirstParam,
[Parameter(
Position=1,
Mandatory=$true)
]
[String]$SecondParam
)
# etc...
}
再次调用它:
"Input1","Input2" | TestMultiplePositionalParameters 'ExplicitArgument'
这次我报错了:
TestMultiplePositionalParameters : The input object cannot be bound to any parameters
for the command either because the command does not take pipeline input or the input
and its properties do not match any of the parameters that take pipeline input.
At C:\...\DEMO_Function_Pipeline_MultiPositionalParams.ps1:77 char:21
+ "Input1","Input2" | TestMultiplePositionalParameters 'ExplicitArgument'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (Input1:String)
[TestMultiplePositionalParameters ], ParameterBindingException
+ FullyQualifiedErrorId : InputObjectNotBound,TestMultiplePositionalParameters
我的问题是:为什么函数的第二个版本将显式参数“ExplicitArgument”传递给第一个参数?我原以为只有第一个参数可以接受管道输入,该函数应该将管道输入传递给第一个参数,并将显式参数传递给第二个参数。
【问题讨论】:
-
做你所期望的需要命令启动,检查输入,然后绑定参数(我认为)。这似乎是一种奇怪的方式来发挥作用。
-
当函数接受管道输入时,这不是实际发生的情况吗?在我的问题中,我忽略了我得到两个错误的事实,一个针对通过管道传递的每个值(
"Input1"和"Input2")。在我看来,该函数运行了开始块,然后返回并从管道中读取第一个值并尝试将其绑定到参数并进行处理(如果它没有抛出错误,如上面的第二个示例所示),然后它从管道中读取第二个值并对其进行绑定和处理。 -
是的,它处理管道输入在绑定命令行参数(并可能运行开始)。您建议的行为与此完全相反。它需要分配管道输入(在开始之前和命令行参数分配之前)。
标签: powershell pipeline powershell-4.0