レジストリキーの値を変更するPowerShell関数があります。コード:
param(
[Parameter()] [switch]$CreateNewChild,
[Parameter(Mandatory=$true)] [string]$PropertyType
)
「CreateNewChild」というパラメーターがあり、そのフラグが設定されている場合、関数はキープロパティが見つからなくても作成します。パラメータ「PropertyType」は必須ですが、「CreateNewChild」フラグが設定されている場合のみです。
問題は、別のパラメーターが指定されている場合にのみ、パラメーターを必須にするにはどうすればよいですか?
わかった、私はそれで遊んでいる。そしてこれはうまくいきます:
param(
[Parameter(ParameterSetName="one")]
[switch]$DoNotCreateNewChild,
[string]$KeyPath,
[string]$Name,
[string]$NewValue,
[Parameter(ParameterSetName="two")]
[switch]$CreateNewChild,
[Parameter(ParameterSetName="two",Mandatory=$true)]
[string]$PropertyType
)
ただし、これは、$ KeyPath、$ Name、および$ NewValueが必須ではなくなったことを意味します。 「1」パラメーターセットを必須に設定すると、コードが壊れます(「パラメーターセットを解決できません」エラー)。これらのパラメーターセットは混乱を招きます。方法はあると思いますが、どうすればいいのか分かりません。
これを実現するためのパラメーターセットを定義することで、これらのパラメーターをグループ化できます。
param (
[Parameter(ParameterSetName='One')][switch]$CreateNewChild,
[Parameter(ParameterSetName='One',Mandatory=$true)][string]$PropertyType
)
参照:
http://blogs.msdn.com/b/powershell/archive/2008/12/23/powershell-v2-parametersets.aspx
---更新---
これが、探している機能を模倣したスニペットです。 「追加」パラメータセットは、-Favoriteスイッチが呼び出されない限り処理されません。
[CmdletBinding(DefaultParametersetName='None')]
param(
[Parameter(Position=0,Mandatory=$true)] [string]$Age,
[Parameter(Position=1,Mandatory=$true)] [string]$Sex,
[Parameter(Position=2,Mandatory=$true)] [string]$Location,
[Parameter(ParameterSetName='Extra',Mandatory=$false)][switch]$Favorite,
[Parameter(ParameterSetName='Extra',Mandatory=$true)][string]$FavoriteCar
)
$ParamSetName = $PsCmdLet.ParameterSetName
Write-Output "Age: $age"
Write-Output "Sex: $sex"
Write-Output "Location: $Location"
Write-Output "Favorite: $Favorite"
Write-Output "Favorite Car: $FavoriteCar"
Write-Output "ParamSetName: $ParamSetName"