J'ai une fonction PowerShell qui modifie les valeurs de clé de registre. Code:
param(
[Parameter()] [switch]$CreateNewChild,
[Parameter(Mandatory=$true)] [string]$PropertyType
)
Il a un paramètre, "CreateNewChild", et si cet indicateur est défini, la fonction créera la propriété de clé, même si elle n'a pas été trouvée. Le paramètre "PropertyType" doit être obligatoire, mais uniquement si l'indicateur "CreateNewChild" a été défini.
La question est, comment puis-je rendre un paramètre obligatoire, mais seulement si un autre paramètre a été spécifié?
OK, j'ai joué avec. Et cela fonctionne:
param(
[Parameter(ParameterSetName="one")]
[switch]$DoNotCreateNewChild,
[string]$KeyPath,
[string]$Name,
[string]$NewValue,
[Parameter(ParameterSetName="two")]
[switch]$CreateNewChild,
[Parameter(ParameterSetName="two",Mandatory=$true)]
[string]$PropertyType
)
Cependant, cela signifie que $ KeyPath, $ Name et $ NewValue ne sont plus obligatoires. Définir "un" ensemble de paramètres sur obligatoire brise le code ("l'ensemble de paramètres ne peut pas être résolu" erreur). Ces ensembles de paramètres prêtent à confusion. Je suis sûr qu'il existe un moyen, mais je ne sais pas comment le faire.
Vous pouvez regrouper ces paramètres en définissant un ensemble de paramètres pour y parvenir.
param (
[Parameter(ParameterSetName='One')][switch]$CreateNewChild,
[Parameter(ParameterSetName='One',Mandatory=$true)][string]$PropertyType
)
Référence:
http://blogs.msdn.com/b/powershell/archive/2008/12/23/powershell-v2-parametersets.aspx
--- Mettre à jour ---
Voici un extrait qui imite la fonctionnalité que vous recherchez. Le jeu de paramètres "Extra" ne sera traité que si le commutateur -Favorite est appelé.
[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"