PowerShell 関数で、いくつかの条件 (たとえば、パラメーターの 1 つが存在しないか false である場合) に基づいて、いくつかのパラメーターを必須にする方法はありますか?
私の考えは、2 つの方法で関数を呼び出せるようにすることです。具体的な例は、SharePoint からリストを取得する関数です。リストの相対 URL (唯一のパラメーター) または Web URL とリスト表示名 (2 つのパラメーター、両方とも必須ですが、リストの相対 URL が使用されていない場合のみ)。
PowerShell 関数で、いくつかの条件 (たとえば、パラメーターの 1 つが存在しないか false である場合) に基づいて、いくつかのパラメーターを必須にする方法はありますか?
私の考えは、2 つの方法で関数を呼び出せるようにすることです。具体的な例は、SharePoint からリストを取得する関数です。リストの相対 URL (唯一のパラメーター) または Web URL とリスト表示名 (2 つのパラメーター、両方とも必須ですが、リストの相対 URL が使用されていない場合のみ)。
Christian が示したように、これは ParameterSetNames を介して実現できます。次の例を見てください。
function Get-MySPWeb {
[CmdletBinding(DefaultParameterSetName="set1")]
param (
[parameter(ParameterSetName="set1")] $RelativeUrl,
[parameter(ParameterSetName="set2")] $WebUrl,
[parameter(ParameterSetName="set2", Mandatory=$true)] $DisplayName
)
Write-Host ("Parameter set in action: " + $PSCmdlet.ParameterSetName)
Write-Host ("RelativeUrl: " + $RelativeUrl)
Write-Host ("WebUrl: " + $WebUrl)
Write-Host ("DisplayName: " + $DisplayName)
}
それを実行すると-RelativeUrl Foo、「set1」にバインドされます。パラメータなしでこの関数を呼び出すと、「set1」にもバインドされます。
(注 - PowerShell v3 (Windows 8 コンシューマー プレビュー) でパラメーターが指定されていない場合、"set1" にバインドされます[CmdletBinding(DefaultParameterSetName="set1")]が、パラメーター ブロックに追加しない限り、PowerShell v2 ではバインド エラーになります。DefaultParameterSetName のヒントをくれた @x0n に感謝します! )
両方のセットのパラメーター値で実行しようとすると、エラーが発生します。
これを実行すると-WebUrl Bar、必須パラメーターであるため、DisplayName のパラメーター値を求めるプロンプトが表示されます。
パラメータ セットの名前付けを使用する必要があります。
排他的なパラメーターを別のパラメーター セット名に割り当てることができます。