2016-10-10 16 views
0

スクリプトの署名が引数で区別される場合、パラメータセットは私にとって意味があります。複数の相互排他的な依存関係を制約するためのパラメータセットの使用

例:

.\myscript.ps1 -InputFile [-Optional1] [-Optional2]... 
.\myscript.ps1 -ArrayOfNames [-Optional1] [-Optional2]... 

私の質問されています。パラメータを使用すると、以下に説明するように、平行(または複数)の依存関係をサポートしたい論理的な選択を設定していますか?

ここに私の現在のシナリオがあります。 タイムスタンプを含むログを照会する既存のスクリプトのサポートを追加しています。スクリプトは、どのユーザを照会するかを特定するために、smtpアドレスの配列であるまたはというCSVファイルを受け入れる必要があります。

スクリプトは、サポートは、現在の日付から計算され、過去の日のn個の数の報告を容易にする整数値を開始および終了日付パラメータ又はべきです。

私がサポートしたい結果は次のとおりです。

[Parameter(Mandatory=$true, ParameterSetName="Input")] 
[ValidateScript({Test-Path -Path $_ -PathType Leaf})][string] $InputFile, 

[Parameter(Mandatory=$true, ParameterSetName="NoInput")] 
[ValidateNotNullOrEmpty()][String[]] $Smtp 

は、Get-ヘルプ:私は私の2つの要件を組み合わせることをしようとしていない場合

.\myScript -InputFile -StartDate -EndDate [-Optional1] [-Optional2]... 
.\myScript -InputFile -LastNumDays [-Optional1] [-Optional2]... 
.\myScript -Smtp -StartDate -EndDate [-Optional1] [-Optional2]... 
.\myScript -Smtp -LastNumDays [-Optional1] [-Optional2]... 

は、次の2つのパラメータの定義のどちらかがうまく機能

.\myScript.ps1 -InputFile <String> [<CommonParameters>] 
.\myScript.ps1 -Smtp <String[]> [<CommonParameters>] 

次のように設定した場合:

[Parameter(Mandatory=$true, ParameterSetName="NotRange")] 
[ValidateNotNullOrEmpty()][int] $LastNumDays = 30, # init 30 days default 

[Parameter(Mandatory=$true, ParameterSetName="Range")] 
[ValidateNotNullOrEmpty()][Alias("Start")] [DateTime] $StartDate, 

[Parameter(Mandatory=$true, ParameterSetName="Range")] 
[ValidateNotNullOrEmpty()][Alias("End")] [DateTime] $EndDate 

は、Get-ヘルプディスプレイとして期待される使用:

.\myScript.ps1 -LastNumDays <Int32> [<CommonParameters>] 
.\myScript.ps1 -StartDate <DateTime> -EndDate <DateTime> [<CommonParameters>] 

問題は、この記事の冒頭で説明したように、私は私の依存関係の両方を組み込むように見えることはできませんということです。次のようにパラメータセットを使用して、これらの二つの論理の依存関係を結合するために私の失敗した試みのひとつの例は次のとおりです。

[Parameter(Mandatory=$true, ParameterSetName="Input")] 
[ValidateScript({Test-Path -Path $_ -PathType Leaf})][string] $InputFile, 

[Parameter(Mandatory=$true, ParameterSetName="NoInput")] 
[ValidateNotNullOrEmpty()][String[]] $Smtp, 

[Parameter(Mandatory=$true, ParameterSetName="NotRange")] 
[Parameter(Mandatory=$true, ParameterSetName="Input")] 
[Parameter(Mandatory=$true, ParameterSetName="NoInput")] 
[ValidateNotNullOrEmpty()][int] $LastNumDays = 30, # init 30 days default 

[Parameter(Mandatory=$true, ParameterSetName="Range")] 
[Parameter(Mandatory=$true, ParameterSetName="Input")] 
[Parameter(Mandatory=$true, ParameterSetName="NoInput")] 
[ValidateNotNullOrEmpty()][Alias("Start")] [DateTime] $StartDate, 

[Parameter(Mandatory=$true, ParameterSetName="Range")] 
[Parameter(Mandatory=$true, ParameterSetName="Input")] 
[Parameter(Mandatory=$true, ParameterSetName="NoInput")] 
[ValidateNotNullOrEmpty()][Alias("End")] [DateTime] $EndDate 

のGet-Helpの結果は、B/C最初の2つの使用文がLastNumDaysとスタート/終了日のパラメータを許可間違っています

私は、必須のtrue/falseの組み合わせと、名前付きパラメータセットの組み込み/省略をテストしましたが、これは成功しませんでした。

私の要件がユースケースに合わないかもしれないと思われています。パラメータセットはサポートすることを意図していましたが、代わりにどのようなパターンと実践を使用すべきか疑問に思っています。

パラメータセットを使用しない場合、これら2つの依存関係の使用法の構文を正しく定義するにはどうすればよいですか? Get-Helpに定義されていない依存関係を宣言するコード内のテストに頼らないでください。

ありがとうございました!

+0

もっと良い選択肢が示唆されない場合は、これは 'DynamicParam'で解決できると思います。 – wOxxOm

答えて

0

各パラメータを一意に設定する必要があります。そのため、PowerShellでは、各パラメータを区別することができます。単純化の理由から、私はパラメータがDを通じて設定します名前を付けます:

A:-InputFile -StartDate -EndDate
B:-InputFile -LastNumDays
はC:-Smtp -StartDate -EndDate
D:-Smtp -LastNumDays

今すぐ各パラメータと、各パラメータを関連付けるには、それが表示されます設定しました中:

Param(
    [Parameter(Mandatory=$true, ParameterSetName="A")] 
    [Parameter(Mandatory=$true, ParameterSetName="B")] 
    [string]$InputFile, 

    [Parameter(Mandatory=$true, ParameterSetName="C")] 
    [Parameter(Mandatory=$true, ParameterSetName="D")] 
    [String[]]$Smtp, 

    [Parameter(Mandatory=$true, ParameterSetName="B")] 
    [Parameter(Mandatory=$true, ParameterSetName="D")] 
    [int]$LastNumDays, 

    [Parameter(Mandatory=$true, ParameterSetName="A")] 
    [Parameter(Mandatory=$true, ParameterSetName="C")] 
    [DateTime]$StartDate, 

    [Parameter(Mandatory=$true, ParameterSetName="A")] 
    [Parameter(Mandatory=$true, ParameterSetName="C")] 
    [DateTime]$EndDate 
) 

出力:

PS C:\>.\test.ps1 -? 
test.ps1 -InputFile <string> -LastNumDays <int> [<CommonParameters>] 
test.ps1 -InputFile <string> -StartDate <datetime> -EndDate <datetime> [<CommonParameters>] 
test.ps1 -Smtp <string[]> -LastNumDays <int> [<CommonParameters>] 
test.ps1 -Smtp <string[]> -StartDate <datetime> -EndDate <datetime> [<CommonParameters>]

とにかく値を指定する必要があるため、必須パラメータ(-LastNumDays)のデフォルト値を指定するのは意味がありません。

+0

Ansgarありがとうございます。あなたはそれを完全に打ちました。また、LastNumDaysにデフォルトの割り当てを使用することについての非常に良い点もあります。このバージョンのパラメータセットはサポートされていなければなりませんが、デフォルトを割り当てても私の目標はまだ満たされています(私は同意します)。私は間違いなくここで道を選び、将来これを念頭に置いていきますが、私が元々考えていた相互排他的な問題を克服するパターンを私に示してくれてありがとう。再度、感謝します! – Keith

関連する問題