1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

Powershellの相互排他的パラメータの使用例

2022-02-04 13:55:42

Powershellの関数は相互に排他的で、ユーザーがどちらか一方しか選択できないようにする必要がある場合があります。
スクリプトの相互に排他的なパラメータセットを作成するには、パラメータに異なる属性のフラグを付け、それらがユニークであることを確認します(パラメータのタイプが自動的に認識されないことを前提としています)。

function Test-ParameterSet
{
 [CmdletBinding(DefaultParameterSetName='number')]
 param
 (
  [int]
  [Parameter(ParameterSetName='number', Position=0)]
  $id,
 
  [string]
  [Parameter(ParameterSetName='text', Position=0)]
  $name
 )
 
 $PSCmdlet.ParameterSetName
 $PSBoundParameters
}



上の関数は、-idと-nameという2つの引数を持ちます。ユーザはどちらか一方のみを使用することができ、両方を使用することはできません。また、この例では、ユーザが入力したパラメータを取得する方法を示しています。

複数の互いに排他的なパラメータは、"ParameterSetName"の設定によって互いに区別することができます(集約パラメータも含まれます)。
実際には、1つのパラメータに複数のパラメータ、つまり固定パラメータとオプションパラメータを割り当てることもできます。

function Test-ParameterSet
{
 [CmdletBinding(DefaultParameterSetName='NonCredential')]
 param
 (
  $id,
 
  [Parameter(ParameterSetName='LocalOnly', Mandatory=$false)]
  $LocalAction,
 
  [Parameter(ParameterSetName='Credential', Mandatory=$true)]
  [Parameter(ParameterSetName='NonCredential', Mandatory=$false)] $LocalAction, [Parameter(ParameterSetName='Credential', Mandatory=$false)]
  $ComputerName,
 
  [Parameter(ParameterSetName='Credential', Mandatory=$false)] $ComputerName, [Parameter(ParameterSetName='Credential', Mandatory=$false)]
  $Credential
 )
 
 $PSCmdlet.ParameterSetName
 $PSBoundParameters
 
 if ($PSBoundParameters.ContainsKey('ComputerName'))
 {
  Write-Warning 'Remote Call!'
 }
}



Test-ParameterSet関数は、"NonCredential"パラメータを使用しているときは-ComputerNameがオプションであること、ユーザーが"-Credential"パラメータを使用すると-ComputerName"が再び必須になり、"-LocalAction"パラメータが使用されていると-ComputerNameと-Credentialが利用できないことを教えてくれる関数です。