0

2つのパラメータを持つ簡単なpowershellスクリプトを作成しました。引数なしでスクリプトを実行しようとするとうまくいきます。私が2つの引数のいずれかでそれを実行しようとすると、正常に動作します。私は両方の引数を指定してスクリプトを実行しようとすると、私は次のエラーを取得する:PowerShellスクリプトを2つの引数の1つに渡すことはできますが、同時に両方の引数を渡すことはできません

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

パラメータセットは、オーバーロードされた関数とよく似ています。必要なパラメータを示すために使用します。オリジナルの例には2つのパラメータセットがあり、それぞれに1つのパラメータがあります。これにより、ユーザはそれらのうちの1つを選択する必要があります。別の状況では、param param1、OR param2、param3のいずれかの関数を使用することができます。次のようなものを表現したい:

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

    #code 
} 

paramが必須真/偽のparamsをあなたの関数に渡される方法の制御の膨大な量を与えるとの組み合わせで設定します。

この例では、パラメータセットしか持たないため、パラメータセットを指定する必要はありません。したがって、関数のパラメータヘッダは次のように指定できます:

function doit2 
{ 
    param(
    [ValidateSet('proj1','proj2', 'proj3', 'proj4')] 
    [string[]]$BuildExclude, 
    [switch]$SkipDbRestore 
    ) 
} 
関連する問題