制作powershell';s参数集使用FileInfo和FileInfo[]

制作powershell';s参数集使用FileInfo和FileInfo[],powershell,powershell-3.0,Powershell,Powershell 3.0,我有以下代码: Function SCCE { [CmdletBinding()] Param( [Parameter(Position=0, Mandatory=$True, ValueFromPipeLine=$True,ParameterSetName="Files")] [System.IO.FileInfo[]]$sourceFiles, [Parameter(Position=0, Mandatory=$True, ValueFromPipeLine=$Tru

我有以下代码:

Function SCCE {
[CmdletBinding()]
Param(
    [Parameter(Position=0, Mandatory=$True, ValueFromPipeLine=$True,ParameterSetName="Files")]
    [System.IO.FileInfo[]]$sourceFiles,
    [Parameter(Position=0, Mandatory=$True, ValueFromPipeLine=$True, ParameterSetName='File')]
    [System.IO.FileInfo]$sourceFile
)
PROCESS {
    Write-Host $PSCmdlet.ParameterSetName
}
}
我希望为指定的类型实现这一点,但据我所知,即使类型是精确的,它也无法实现

例如:

$file = (ls)[0]
$file.getType() #FileInfo
SCCE $file
SCCE:无法使用指定的名称解析参数集 参数。第1行字符:1
+SCCE$文件
+~~~~~~~~~~
+类别信息:InvalidArgument:(:)[SCCE],ParentContainerErrorRecordException
+FullyQualifiedErrorId:含糊不清的参数集,SCCE

注释掉sourceFiles参数似乎解决了这个问题,但我不明白为什么这是不明确的。它与第二个参数完美匹配


如何解决此问题?

我不确定为什么您将它们都设置为
强制=$True
,或者为什么您甚至为每种类型都设置了一个集。只要使用一个数组,如果只有一个文件要传递,那么它将只是一个长度为1的数组

Function SCCE {
[CmdletBinding()]
Param(
    [Parameter(Position=0, Mandatory=$True,ValueFromPipeLine=$True,ParameterSetName="Files")]
    [System.IO.FileInfo[]]$sourceFiles
)
  PROCESS {
    Write-Host $PSCmdlet.ParameterSetName
  }
}
然后你可以像这样打电话:

> SCCE (gci . -file)
Files
> SCCE (gci . -file)[0]
Files

这是一个玩具的例子来说明这个问题。事实上,这两起案件的处理方式不同。有没有办法防止在存在精确匹配的情况下对数组进行隐式强制转换?为什么要这样做?假设您有一个数组,您会以某种方式对其进行迭代吗?即使只有一个元素需要迭代,为什么不这样做呢?我想我可以这样做,但如果Powershell可用,它不支持精确匹配,这似乎很奇怪。另一件事是,基本情况实际上是一个文件(如果给它一个文件数组,它会以特定的方式连接它们,然后将其传递给一个文件情况)@soandos。你不能这样做,所有的参数都是强制性的。“强制性”表示无论位置重载如何,始终是强制性的。您是否尝试指定默认参数集?@PetSerAl H'm,否。但这似乎有效。但是,有没有办法解决核心问题(Powershell正在寻找精确匹配的近似匹配)?由于我从未看到描述Powershell参数集解析的精确行为的文档,因此指定默认参数集是我能提供的最好方法。