IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Multiple SetName et Mandatory [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Nouveau membre du Club
    Profil pro
    Architecte Cloud
    Inscrit en
    Mars 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Architecte Cloud

    Informations forums :
    Inscription : Mars 2009
    Messages : 27
    Points : 33
    Points
    33
    Par défaut Multiple SetName et Mandatory
    Bonjour à tous,

    Voilà je viens vous demander votre aide car je bloque un peu sur l'utilisation de 2 ParameterSetName pour définir des paramètres mandatory ou non.
    Mon contexte, un script doit déclencher le déploiement d'un site web composé d'un portail et de web services. Comme l'utilisateur peut intervenir à différents moments, j'avais idée de faire que le script peut déclencher soit le déploiement des 2, soit juste du portail, soit juste des web services.

    Je suis donc parti sur une déclaration de paramètre dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    param(
     [Parameter(Mandatory=$true)]
     [string] $ServerName,
    
     [Parameter(Mandatory=$true, ParameterSetName="CreateWebServices")]
     [Parameter(Mandatory=$false, ParameterSetName="CreatePortal")]
     [switch] $CreateWebServices,
    
     [Parameter(Mandatory=$true, ParameterSetName="CreateWebServices")]
     [Parameter(Mandatory=$false, ParameterSetName="CreatePortal")]
     [string] $WebServicesParameterFilePath,
    
     [Parameter(Mandatory=$true, ParameterSetName="CreatePortal")]
     [Parameter(Mandatory=$false, ParameterSetName="CreateWebServices")]
     [switch] $CreatePortal,
    
     [Parameter(Mandatory=$true, ParameterSetName="CreatePortal")]
     [Parameter(Mandatory=$false, ParameterSetName="CreateWebServices")]
     [string] $PortalParameterFilePath
    )
    Lorsque j'appelle le script avec -CreateWebServices ou -CreatePortal, ça marche.
    En revanche, si je le lance avec les 2, j'obtiens l'erreur AmbiguousParameterSet.

    J'ai essayé de modifier les noms des Set en me disant qu'il se mélangeait peut-être avec le nom de mes switch, mais non...

    Est-ce que vous auriez une idée de ce que j'ai raté?

    Merci d'avance de votre aide!

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par Syriel Voir le message
    Est-ce que vous auriez une idée de ce que j'ai raté?
    Chaque jeu doit avoir une valeur unique pour le différencier des autres jeu.
    Là tous les paramètres sont dans les mêmes jeu, l'ajout d'un troisième switch permet de réaliser ; soit l'un (WS) soit l'autre (Portal) ou les deux (WS + Portal)
    Un jeu de paramètre c'est une fonctionnalité du script, soit l'une soit l'autre. -CreateAll réalise dans ton code l'une ET l'autre.

    Pour 3 ou 4 fonctionnalités ce principe reste accessible, au delà ça devient à mon avis vite ardu*.
    A moins de créer ce type de fonction pour tester.

    Une solution à tester :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Function Test {
      param(
        #par défaut tous les jeux 
       [Parameter(Mandatory=$true)]
       [string] $ServerName,
     
       [Parameter(Mandatory=$true, ParameterSetName="CreateWebServices")]
       [switch] $CreateWebServices,
     
       [Parameter(Mandatory=$true, ParameterSetName="CreateWebServices")]
       [Parameter(Mandatory=$true, ParameterSetName="CreateAll")]
       [string] $WebServicesParameterFilePath,
     
       [Parameter(Mandatory=$true, ParameterSetName="CreatePortal")]
       [switch] $CreatePortal,
     
       [Parameter(Mandatory=$true, ParameterSetName="CreatePortal")]
       [Parameter(Mandatory=$true, ParameterSetName="CreateAll")]
       [string] $PortalParameterFilePath,
     
       [Parameter(Mandatory=$true, ParameterSetName="CreateAll")]
       [switch] $CreateAll
     
      )
     Write-Host "ParameterSetName =$($PsCmdlet.ParameterSetName)"
     switch ($PsCmdlet.ParameterSetName)
     {
       'CreateAll'  {  Write-Host "Call create : $($PsCmdlet.ParameterSetName)";break}
       'CreateWebServices'  {  Write-Host "Call create : $($PsCmdlet.ParameterSetName)";break} 
       'CreatePortal'  {  Write-Host "Call create : $($PsCmdlet.ParameterSetName)";break} 
     }
    }
    Test
    Test -ServerName 'Srv1'
    Test -ServerName 'Srv1' -Create
    Test -ServerName 'Srv1' -WebServicesParameterFilePath 'WS'  -PortalParameterFilePath 'Portal' -CreateAll
    Test -ServerName 'Srv1' -PortalParameterFilePath 'Portal' -CreatePortal
    Test -ServerName 'Srv1' -WebServicesParameterFilePath 'WS' -CreateWebServices
     
    Test -CreateAll
    Test -CreatePortal
    Test -CreateWebServices
     
    Test -CreateWebServices -CreatePortal
    Test -CreateWebServices -CreateAll
     
    Test -CreateWebServices -PortalParameterFilePath 'P' 
    Test -CreatePortal -WebServicesParameterFilePath 'W'

    * Par exemple si on souhaite gérer en plus le jeu Path ET LiteralPath

  3. #3
    Nouveau membre du Club
    Profil pro
    Architecte Cloud
    Inscrit en
    Mars 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Architecte Cloud

    Informations forums :
    Inscription : Mars 2009
    Messages : 27
    Points : 33
    Points
    33
    Par défaut
    Ah mais oui, simplement en passant par un 3ème Set, pourquoi n'y ai-je pas pensé tout seul?

    Un énorme merci à toi!

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    En te citant les fonctions dans ma première réponse je me suis dit, pourquoi ne pas les regrouper dans un module ?
    Du coup j'ai fait qq tests sur mon code avec ta fonction :

    Ce cas pose pb :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    Test -ServerName "Srv1" -WebServicesParameterFilePath "WS" -PortalParameterFilePath "Portal"
    car les paramètres de type [switch] sont indiqué Mandatory, ce qui est contradictoire selon moi.

    Et en générant les différents cas, on constate que les switchs sont redondant :
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Function Test {
      param(
        #par défaut tous les jeux 
       [Parameter(Mandatory=$true)]
       [string] $ServerName,
     
       [Parameter(Mandatory=$true, ParameterSetName="CreateWebServices")]
       [Parameter(Mandatory=$true, ParameterSetName="CreateAll")]
       [string] $WebServicesParameterFilePath,
     
       [Parameter(Mandatory=$true, ParameterSetName="CreatePortal")]
       [Parameter(Mandatory=$true, ParameterSetName="CreateAll")]
       [string] $PortalParameterFilePath#,
    # 
    #    [Parameter(Mandatory=$false, ParameterSetName="CreateAll")]
    #    [switch] $CreateAll
     
      )
     Write-Host "ParameterSetName =$($PsCmdlet.ParameterSetName)"
     switch ($PsCmdlet.ParameterSetName)
     {
       'CreateAll'  {  Write-Host "Call $($PsCmdlet.ParameterSetName)";break}
       'CreateWebServices'  {  Write-Host "Call $($PsCmdlet.ParameterSetName)";break} 
       'CreatePortal'  {  Write-Host "Call $($PsCmdlet.ParameterSetName)";break} 
     }
    }
     
    Test -ServerName "Srv1" -PortalParameterFilePath "Portal"
    Test -ServerName "Srv1" -WebServicesParameterFilePath "WS"
    Test -ServerName "Srv1" -WebServicesParameterFilePath "WS" -PortalParameterFilePath "Portal"

    Enfin les jeux existant ne respectent pas cette règle d'unicité :
    Set CreatePortal
    # ServerName
    # PortalParameterFilePath

    Set CreateWebServices
    # ServerName
    # WebServicesParameterFilePath

    Set CreateAll
    # ServerName
    # WebServicesParameterFilePath
    # PortalParameterFilePath

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 87
    Dernier message: 06/07/2011, 15h33
  2. Multiple Count
    Par Antichoc dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2003, 11h19
  3. formulaire choix multiple
    Par pram dans le forum XMLRAD
    Réponses: 6
    Dernier message: 02/02/2003, 18h59
  4. Création multiple table paradox dans le code
    Par scarabee dans le forum C++Builder
    Réponses: 8
    Dernier message: 30/10/2002, 10h17
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo