Question
Appel de fonction en fonction du parametre
- lakcil
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 23
- Remerciements reçus 0
Je n'ai pas pu trouver un titre assez descriptif de mon problème.
Je souhaite écrire une fonction qui s'exécutera de façon différente en fonction qu'un paramètre lui soit passé ou pas.
Un bout de ce que j'ai commencé à faire:
[code:1]
function test(){
param( [System.Collections.ArrayList]$liste, [STRING]$force, [switch]$whatIf)
if($force -eq [String]::Empty){
Write-Host \"je lance sans le parametre force\"
}else{
Write-Host \"je lance avec le parametre force\"
}
}
[/code:1]
Je n'ai pas encore le résultat attendu et j'ai du mal à voir comment implémenté ma fonction.
Je voudrai que:
* l'appel de : test -liste -$whatIf:$flase passe dans la if et affiche \"je lance sans le paramètre force\"
*l'appel de test : test -liste -$whatIf:$flase -force passe dans le else et affiche \"je lance avec le paramètre force\"
NB: je veux bien lancer sans devoir donner une valeur à $force lors de l'appel de la fonction
Une telle chose est-elle possible ?
Merci pour vos retour
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
lakcil écrit:
Il faut déjà savoir ce que permet PowerShell sur ce sujet, c'est à dire se documenter sur les possibilités d'un produit afin de connaitre ce qu'il est possible de faire avec.j'ai du mal à voir comment implémenter ma fonction.
lakcil écrit:
En premier lieu ne recode pas un switch existant, car whatIf est un paramètre commun à tous les cmdlets et toutes les fonctions avancées.Je voudrais que:
* l'appel de : test -liste -$whatIf:$false
C'est surtout un comportement prévus/attendu.
lakcil écrit:
Le texte associé au switch whatIf est erroné, car Force est un aussi un comportement de cmdlet/fonction.Je voudrai que:
*l'appel de test : test -liste -$whatIf:$flase -force passe dans le else et affiche \"je lance avec le paramètre force\"
Tu mélanges donc deux comportements, soit tu forces une action soit tu demandes une simulation d'une action.
Forcer une simulation n'a pas de sens ici.
De plus la variable $force doit être de type [Switch]. Imagine la maintenance du code suivant:
[code:1]
Test e1,e2,e3 toto -whatIf
[/code:1]
Pas de pb ça fonctionne, quand à savoir ce que toto signifie...
lakcil écrit:
Le paramètre Force est donc une option.NB: je veux bien lancer sans devoir donner une valeur à $force lors de l'appel de la fonction
lakcil écrit:
Oui, sous réserve de pouvoir le coder en respectant les régles des jeux de paramètres.Une telle chose est-elle possible ?
lakcil écrit:
C'est vrai que ce n'est pas évident, quoique l'usage du terme \"comportement\" soit judicieux ici.Je n'ai pas pu trouver un titre assez descriptif de mon problème.
Sinon on peut constater ici :
[code:1]
function test(){
param(
[System.Collections.ArrayList]$liste,
....
[/code:1]
que la parseur de PS n'est pas contrariant
On peut donc lui déclarer une fonction qui n'a pas de paramètre, mais un peu quand même !
Consulte ce tuto .
Message édité par: Laurent Dardenne, à: 7/10/11 20:11<br><br>Message édité par: Laurent Dardenne, à: 15/10/11 23:35
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- lakcil
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 23
- Remerciements reçus 0
Je crois que j'ai mal expliqué mon problème.
Je ne cherche pas à réécrire des cmdlet powershell.
Pour le switch j'utilise bien la variable $whatIfPreference et la précense de cette variable dans ma fonction est destinée à propagée le whatIf dans toutes les fonctions de mon script (mais sur ce point j'ai pas de problème).
Concerant le parametre $force, j'ai mal chosir le nom de ma variable. Je ne cherche pas à inplémenter l'option force déja existante dans powershel c'est-à-dire forcé une commande à s'exécuter.Je m'explique.
J'ai écris une fonction qui gère l'extinction des machines virtuelle vmware. la fonction commence par une extinction propre c'est à dire un shutdown de l'OS de la VM et si il un problème , fait un stop directe de la vm. Mon objectif est de rajouter dans cette fonction un parametre qui permettra à l'utilisateur de faire un stop direct.
* si j'appelle ma fonction arretVM sans ce parametre l'extinction sera d'abord OS puis Stop si besoin
* Et si j'appelle ma fonction arretVm -param, là il fera un stop direct.
Mon besoin est donc d'appeler la même fonction avec ou sans paramètre et d'avoir des comportements différents.
J'espère mes explications sont moins confuses.
J'ai commencé à regarder le tuto et encore merci.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
lakcil écrit:
Ce n'est jamais évident...Je crois que j'ai mal expliqué mon problème.
lakcil écrit:
Ce n'est peut être pas ton intention, mais il n'est pas nécessaire de préciser le paramètre Whatif dans la liste des paramètres à partir du moment où tu utilises l'attribut CmdletBinding :Je ne cherche pas à réécrire des cmdlet powershell.
[code:1]
function Test{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)
process {
if ($psCmdlet.shouldProcess(\"Opération Traitement\"«») -eq $false)
{ Write-Host \"je lance avec WhatIf\" }
else
{ Write-Host \"je lance sans WhatIf\" }
}
}
[/code:1]
lakcil écrit:
Force n'est pas implémenté par défaut dans Powershell, il reste à la charge du scripteur.Je ne cherche pas à implémenter l'option force déja existante dans powershel
lakcil écrit:
Si tu nommes ta fonction avec le verbe Stop, l'usage du paramètre Force est cohérent.Mon objectif est de rajouter dans cette fonction un parametre qui permettra à l'utilisateur de faire un stop direct.
lakcil écrit:
Elle n'étaient en rien confuses, mais peut être imprécises.J'espère mes explications sont moins confuses.
[code:1]
function Test2{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)
process
{
if ($psCmdlet.shouldProcess($_, \"Opération Traitement\"«») -eq $false)
{ Write-Host \"je lance avec WhatIf mais ne peut forcer le traitement\"}
elseif ($force)
{ Write-Host \"je lance sans WhatIf et force le traitement\"}
else
{Write-host \"je lance sans WhatIf et sans forcer le traitement\"}
}
}
[/code:1]
Ne pas oublier le comportement Confirm lié au paramètre SupportsShouldProcess de l'attribut CmdletBinding.
Une fois que tu auras codé cela, je pense que ta fonction sera très appréciée des utilisateurs
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- lakcil
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 23
- Remerciements reçus 0
Merci pour tes réponses.Bonjour,
lakcil écrit:Ce n'est jamais évident...Je crois que j'ai mal expliqué mon problème.
lakcil écrit:Ce n'est peut être pas ton intention, mais il n'est pas nécessaire de préciser le paramètre Whatif dans la liste des paramètres à partir du moment où tu utilises l'attribut CmdletBinding :Je ne cherche pas à réécrire des cmdlet powershell.
[code:1]
function Test{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)
process {
if ($psCmdlet.shouldProcess(\"Opération Traitement\"«») -eq $false)
{ Write-Host \"je lance avec WhatIf\" }
else
{ Write-Host \"je lance sans WhatIf\" }
}
}
[/code:1]
lakcil écrit:Force n'est pas implémenté par défaut dans Powershell, il reste à la charge du scripteur.Je ne cherche pas à implémenter l'option force déja existante dans powershel
lakcil écrit:Si tu nommes ta fonction avec le verbe Stop, l'usage du paramètre Force est cohérent.Mon objectif est de rajouter dans cette fonction un parametre qui permettra à l'utilisateur de faire un stop direct.
lakcil écrit:Elle n'étaient en rien confuses, mais peut être imprécises.J'espère mes explications sont moins confuses.
[code:1]
function Test2{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)
process
{
if ($psCmdlet.shouldProcess($_, \"Opération Traitement\"«») -eq $false)
{ Write-Host \"je lance avec WhatIf mais ne peut forcer le traitement\"}
elseif ($force)
{ Write-Host \"je lance sans WhatIf et force le traitement\"}
else
{Write-host \"je lance sans WhatIf et sans forcer le traitement\"}
}
}
[/code:1]
Ne pas oublier le comportement Confirm lié au paramètre SupportsShouldProcess de l'attribut CmdletBinding.
Une fois que tu auras codé cela, je pense que ta fonction sera très appréciée des utilisateurs
En parcourant le tuto que tu m'as envoyé et le code, j'ai voulu voir un peu ce que contient la variable
$PSCmdlet.
J'ai ainsi vu qu'il y avait une autre variable
$PSBoundParameters présente dès lors qu'on utilise[CmdletBinding]. Cette variable étant de type System.Collections.Generic.Dictionary, j'ai voulu accéder aux clés et valeurs lors de l'appel d'une fonction mais les valeurs (des deux derniers paramètres)ne s'affichent pas.
En appelant la fonction juste au-dessus de cette manière:
[code:1] test2 -liste $listetest -WhatIf -force[/code:1] Le code suivant n'affiche que la valeur du premier paramètre passé à la fonction test2
[code:1]
foreach ($element in $PSBoundParameters){
$PSBoundParameters.Values
}
[/code:1]
J'aurais encore besoin d'un coup de main pour identifier mon erreur ou affiche le résultat attendu.
Cdt,
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Dans ce cas utilise un énumérateur :Cette variable étant de type System.Collections.Generic.Dictionary,
[code:1]
function Test2{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)
process
{
$PSBoundParameters.Values|% { Write-Warning \"$_\";$_|Fl}
Write-host (\"-\" *40) -fore green
$PSBoundParameters.GetEnumerator()|Foreach {$_|Fl}
if ($psCmdlet.shouldProcess($_, \"Opération Traitement\"«») -eq $false)
{ Write-Host \"je lance avec WhatIf mais ne peut forcer le traitement\"}
elseif ($force)
{ Write-Host \"je lance sans WhatIf et force le traitement\"}
else
{Write-host \"je lance sans WhatIf et sans forcer le traitement\"}
}
}
$listetest=@(1,2,3)
test2 -liste $listetest -WhatIf -force
[/code:1]
Et si je peux me permette, peux-tu éviter de recopier tout le message précédent à chaque réponse ?
Car ainsi j'ai un peu de mal à suivre les échanges.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Appel de fonction en fonction du parametre