web-dev-qa-db-fra.com

Le paramètre obligatoire PowerShell dépend d'un autre paramètre

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.

19
simon

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

http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.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"
27
Rex Hardin