2015-02-10 65 views
1

我有以下代碼:使PowerShell的PARAMETERSET工作用的FileInfo和的FileInfo []

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 $文件
+ ~~~~~~~~~~
+ CategoryInfo:InvalidArgument:(:) [SCCE],ParentContainsErrorRecordException
+ FullyQualifiedErrorId:AmbiguousParameterSet,SCCE

註釋掉sourceFiles參數似乎證明了這個問題,但我不明白爲什麼這是不明確的。這是第二個參數的完美搭配。

我該如何解決這個問題?

+0

你有沒有試過指定默認的參數設置? – PetSerAl 2015-02-10 11:42:20

+0

@PetSerAl H'm,no。這似乎工作,但。有沒有辦法解決核心問題(即Powershell正在尋找一個精確匹配的存在)? – soandos 2015-02-10 11:45:49

+0

由於我從來沒有看到描述PowerShell的參數集分辨率的確切行爲的文檔,指定默認參數集是我能提供的最好的東西。 – PetSerAl 2015-02-11 00:23:17

回答

1

我不確定你爲什麼把它們都設置爲Mandatory=$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 
+0

這是一個玩具的例子來說明問題。實際上,這兩種情況的處理方式不同。有一種方法可以在完全匹配的情況下防止隱式轉換爲數組嗎? – soandos 2015-02-10 11:33:35

+0

你爲什麼想要?大概如果你有一個數組,你以某種方式迭代它?即使只有一個元素可以迭代,爲什麼不這樣做呢? – arco444 2015-02-10 11:34:58

+0

我想我可以做到這一點,但它看起來很奇怪,如果Powershell可用,Powershell不會進行精確匹配。另一件事是,基本情況實際上是一個文件(如果它給了一個文件數組,它以特定的方式連接它們,然後將它傳遞給一個文件大小寫) – soandos 2015-02-10 11:38:08