Question Appel de fonction en fonction du parametre

Plus d'informations
il y a 14 ans 5 mois #10372 par lakcil
Salut,
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.

Plus d'informations
il y a 14 ans 5 mois #10375 par Laurent Dardenne
Salut lakcil,
lakcil écrit:

j'ai du mal à voir comment implémenter ma fonction.

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.
lakcil écrit:

Je voudrais que:
* l'appel de : test -liste -$whatIf:$false

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.
C'est surtout un comportement prévus/attendu.
lakcil écrit:

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\"

Le texte associé au switch whatIf est erroné, car Force est un aussi un comportement de cmdlet/fonction.
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:

NB: je veux bien lancer sans devoir donner une valeur à $force lors de l'appel de la fonction

Le paramètre Force est donc une option.
lakcil écrit:

Une telle chose est-elle possible ?

Oui, sous réserve de pouvoir le coder en respectant les régles des jeux de paramètres.
lakcil écrit:

Je n'ai pas pu trouver un titre assez descriptif de mon problème.

C'est vrai que ce n'est pas évident, quoique l'usage du terme \"comportement\" soit judicieux ici.

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.

Plus d'informations
il y a 14 ans 5 mois #10381 par lakcil
Tout d'abord merci pour ta réponse et pour le lien avec le tuto.
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.

Plus d'informations
il y a 14 ans 5 mois #10382 par Laurent Dardenne
Bonjour,
lakcil écrit:

Je crois que j'ai mal expliqué mon problème.

Ce n'est jamais évident...
lakcil écrit:

Je ne cherche pas à réécrire des cmdlet powershell.

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 :
[code:1]
function Test{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)
process {
if ($psCmdlet.shouldProcess(\&quot;Opération Traitement\&quot;«») -eq $false)
{ Write-Host \&quot;je lance avec WhatIf\&quot; }
else
{ Write-Host \&quot;je lance sans WhatIf\&quot; }
}
}
[/code:1]
lakcil écrit:

Je ne cherche pas à implémenter l'option force déja existante dans powershel

Force n'est pas implémenté par défaut dans Powershell, il reste à la charge du scripteur.
lakcil écrit:

Mon objectif est de rajouter dans cette fonction un parametre qui permettra à l'utilisateur de faire un stop direct.

Si tu nommes ta fonction avec le verbe Stop, l'usage du paramètre Force est cohérent.
lakcil écrit:

J'espère mes explications sont moins confuses.

Elle n'étaient en rien confuses, mais peut être imprécises.
[code:1]
function Test2{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)

process
{
if ($psCmdlet.shouldProcess($_, \&quot;Opération Traitement\&quot;«») -eq $false)
{ Write-Host \&quot;je lance avec WhatIf mais ne peut forcer le traitement\&quot;}
elseif ($force)
{ Write-Host \&quot;je lance sans WhatIf et force le traitement\&quot;}
else
{Write-host \&quot;je lance sans WhatIf et sans forcer le traitement\&quot;}
}
}
[/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.

Plus d'informations
il y a 14 ans 5 mois #10387 par lakcil
Laurent Dardenne écrit:

Bonjour,
lakcil écrit:

Je crois que j'ai mal expliqué mon problème.

Ce n'est jamais évident...
lakcil écrit:

Je ne cherche pas à réécrire des cmdlet powershell.

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 :
[code:1]
function Test{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)
process {
if ($psCmdlet.shouldProcess(\&quot;Opération Traitement\&quot;«») -eq $false)
{ Write-Host \&quot;je lance avec WhatIf\&quot; }
else
{ Write-Host \&quot;je lance sans WhatIf\&quot; }
}
}
[/code:1]
lakcil écrit:

Je ne cherche pas à implémenter l'option force déja existante dans powershel

Force n'est pas implémenté par défaut dans Powershell, il reste à la charge du scripteur.
lakcil écrit:

Mon objectif est de rajouter dans cette fonction un parametre qui permettra à l'utilisateur de faire un stop direct.

Si tu nommes ta fonction avec le verbe Stop, l'usage du paramètre Force est cohérent.
lakcil écrit:

J'espère mes explications sont moins confuses.

Elle n'étaient en rien confuses, mais peut être imprécises.
[code:1]
function Test2{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)

process
{
if ($psCmdlet.shouldProcess($_, \&quot;Opération Traitement\&quot;«») -eq $false)
{ Write-Host \&quot;je lance avec WhatIf mais ne peut forcer le traitement\&quot;}
elseif ($force)
{ Write-Host \&quot;je lance sans WhatIf et force le traitement\&quot;}
else
{Write-host \&quot;je lance sans WhatIf et sans forcer le traitement\&quot;}
}
}
[/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
:-)

Merci pour tes réponses.
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.

Plus d'informations
il y a 14 ans 5 mois #10389 par Laurent Dardenne
lakcil écrit:

Cette variable étant de type System.Collections.Generic.Dictionary,

Dans ce cas utilise un énumérateur :
[code:1]
function Test2{
[CmdletBinding(SupportsShouldProcess=$True)]
param( [System.Collections.ArrayList]$liste, [Switch]$force)

process
{
$PSBoundParameters.Values|% { Write-Warning \&quot;$_\&quot;;$_|Fl}
Write-host (\&quot;-\&quot; *40) -fore green
$PSBoundParameters.GetEnumerator()|Foreach {$_|Fl}

if ($psCmdlet.shouldProcess($_, \&quot;Opération Traitement\&quot;«») -eq $false)
{ Write-Host \&quot;je lance avec WhatIf mais ne peut forcer le traitement\&quot;}
elseif ($force)
{ Write-Host \&quot;je lance sans WhatIf et force le traitement\&quot;}
else
{Write-host \&quot;je lance sans WhatIf et sans forcer le traitement\&quot;}
}
}
$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.

Temps de génération de la page : 0.110 secondes
Propulsé par Kunena