0

我做了一個簡單的PowerShell腳本有兩個參數。如果我嘗試執行沒有參數的腳本,它可以正常工作。如果我試圖用兩個參數中的任何一個來執行它,它就可以正常工作。當我嘗試用兩個參數運行該腳本,我得到以下錯誤:可以通過PowerShell腳本兩個參數之一,但不是兩個參數在同一時間

Parameter set cannot be resolved using the specified named parameters. 

它還在那裏大約AmibiguousParameterSet珍聞。

我的腳本的參數部分看起來是這樣的:

[CmdletBinding(DefaultParameterSetName="None")] 
param(
    [Parameter(Mandatory=$False, ParameterSetName="BuildExclude")] 
    [ValidateSet('proj1','proj2', 'proj3', 'proj4')] 
    [string[]]$BuildExclude, 
    [Parameter(Mandatory=$False, ParameterSetName="SkipDbRestore")] 
    [switch]$SkipDbRestore 
) 

這些用法工作:

.\RunScript.ps1 -BuildExclude proj1, proj2 
.\RunScript.ps1 -SkipDbRestore 
.\RunScript.ps1 

這種用法不會爲上述工作的原因所在:

.RunScript.ps1 -BuildExclude proj1, proj2 -SkipDbRestore 

即使我顛倒了參數的順序,它也不起作用。我嘗試添加參數位置,使BuildExclude = 0和SkipDbRestore = 1,希望我能夠讓他們一起工作,如果我至少保持他們的順序。但是這給了我相同的模糊性錯誤。我錯過了什麼?理想情況下,我希望能夠以任何順序使用參數調用腳本,並讓它做正確的事情。

回答

3

參數集非常類似於重載函數 - 您使用它們來指示您需要哪些參數。你最初的例子有兩個參數集,每個參數集有一個參數。這迫使用戶選擇其中之一。在另一種情況下,你可能有一個函數,它要麼參數param1,或參數2和參數3。你會表達這樣:

function Doit 
{ 
    Param(
     [Parameter(Mandatory=$true, ParameterSetName="paramset1")] 
     $param1, 
     [Parameter(Mandatory=$true, ParameterSetName="paramset2")] 
     $param2, 
     [Parameter(Mandatory=$true, ParameterSetName="paramset2")] 
     $param3 
    ) 

    #code 
} 

帕拉姆集結合強制性真/假給出PARAMS如何傳遞到您的功能控制的巨大數額。

在你的例子中,你根本不需要指定一個參數集,因爲你只有一個。所以你的函數的參數頭可以這樣指定:

function doit2 
{ 
    param(
    [ValidateSet('proj1','proj2', 'proj3', 'proj4')] 
    [string[]]$BuildExclude, 
    [switch]$SkipDbRestore 
    ) 
} 
相關問題