Question
[Résolu] Fonction avec Arguments
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 78
- Remerciements reçus 0
Car ca en sera pas des paramètres en entrés. Pas comme ceux qu'on déclare en début de fonction vu qu'on ne devra pas demander de valeur mais en récupérer si le paramètre est spécifié.
Francis
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
[code:1]
function SearchLDAP {
[CmdletBinding()]
param(
[Parameter(Mandatory=$True,position=0)]
$UID,
[Parameter(Mandatory=$false,position=1)]
$Login,
[switch] $Mail,
[switch] $Service
)
#$PSBoundParameters|Out-String
# Version 'mixte'
# $PSBoundParameters.GetEnumerator()|? {$_.Value -is [switch] }
if ($mail) {'$CurrentObjectLDAP.properties.item(\"Mail\"«»)'} #ou getProperty -Name Mail
if ($Service) {'$CurrentObjectLDAP.properties.item(\"Service\"«»)'}
}
SearchLdap -UID 12345 -Mail -Service
$Params=@{
UID=12345
Mail=$true
Service=$true
}
SearchLdap @params
[/code:1]
Version avec un tableau de nom d'atttribut :
[code:1]
function SearchLDAP {
[CmdletBinding(DefaultParameterSetName=\"Property\"«»)]
param(
[Parameter(Mandatory=$True,position=0,ParameterSetName=\"Property\"«»)]
$UID,
[Parameter(Mandatory=$false,position=1,ParameterSetName=\"Property\"«»)]
$Login,
[Parameter(Mandatory=$false,position=2,ParameterSetName=\"Property\"«»)]
[string[]]$Property,
[Parameter(Mandatory=$True,position=2,ParameterSetName=\"AutreJeu\"«»)]
$Autre
)
$PSBoundParameters|Out-String
$Property|% { $CurrentObjectLDAP.properties.item($_)}
}
SearchLdap -UID 12345
SearchLdap -UID 12345 -property mail,Service
$t=@('mail','Service')
SearchLdap -UID 12345 -property $T
[/code:1]
On peut aussi faire un mixte des deux, créer un tableau interne de noms d'attribut à partir des noms de paramètre liés de type Switch. Un peu lourd mais possible et éviterait les tests de présence de chaque switch.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 78
- Remerciements reçus 0
Merci pour ton temps;
J'essaye de comprendre ton premier code.
Si je comprend tout, tu déclares tes paramètres (UID, Login), tu rend le paramètre UID obligatoire en entrée.
Après tu ajoutes un switch sur Mail et Service. (qui ne sont que des commutateurs à l'arrivée?)
Et du coup tu test si l'un des commutateurs est entré et si c'est le cas tu fais une action.
Mais par contre du coup il ne faudrait pas faire un Switch pour UID et Login afin d'appliquer une action déjà sur l'entrée du paramètre ?
[code:1]
switch($PsCmdlet.ParameterSetName)
{
\"UID\" {$objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\"uid\"«») -eq $UID}}
\"Login\" {$objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\"login\"«») -eq $Login}}
}
[/code:1]
Et du coup il faudrait que j'envoi le résultat du switch dans une variable pour l'utiliser dans le \"If\" des commutateurs \"Mail\", \"Service\"?
Est-ce que je peux faire un truc du genre :
[code:1]
\"UID\" {$objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\"uid\"«») -eq $UID} -outvaraible Result}
\"Login\" {$objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\"login\"«») -eq $Login} -outvaraible Result}
[/code:1]
et faire mon \"If\" des commutateurs après?
[code:1]
if ($mail) {$Result.Properties.get_item(\"Mail\"«»)} #ou getProperty -Name Mail
if ($Service) {$Result.properties.item(\"Service\"«»)}
[/code:1]
J'ai l'impression qu'il ne traite pas le Switch UID/Login avant le \"IF\" et du coup mon $_. a une valeur $Null. Est-ce du fait de la déclaration [Switch]Mail et Service du début qui m'empêche de faire le Switch sur $PsCmdlet.ParameterSetName?
Le $Mail ne pourra avoir que 2 valeurs? $True ou $False si je comprend bien.
Désolé des questions, je me suis peut être lancé dans quelque chose qui dépasse de loin mon niveau mais c'est intéressant.
Francis
Connexion ou Créer un compte pour participer à la conversation.
- buissonneau
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 78
- Remerciements reçus 0
Francis
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
xaviar écrit:
De rienMerci pour ton temps
xaviar écrit:
A toi de voir si c'est vraiment le cas, c'est juste une ébauche.tu rend le paramètre UID obligatoire en entrée.
xaviar écrit:
Oui, le type [Switch] porte bien son nomAprès tu ajoutes un switch sur Mail et Service. (qui ne sont que des commutateurs à l'arrivée?)
xaviar écrit:
Si c'est aussi un attribut, oui. Mais UID a une valeur qui n'est pas du type boolean, ce n'est donc pas possible.Mais par contre du coup il ne faudrait pas faire un Switch pour UID et Login afin d'appliquer une action déjà sur l'entrée du paramètre ?
xaviar écrit:
Je ne fais de L'ADSI tous les jours; mais je pense qu'on peut filtrer en amont, pas besoin de tout récupérer pour n'en garder qu'un.\"UID\" {$objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\"uid\") -eq $UID}}
Je t'ai proposé du code 'générique' sans vraiment tenir compte de ton code initial.
xaviar écrit:
A priori oui, le second appel doit être -outvariable +Result, sinon tu écrases le contenu existant. Si l'objectif est de collecter un tableau de nom d'attributs.Et du coup il faudrait que j'envoi le résultat du switch dans une variable pour l'utiliser dans le \"If\" des commutateurs \"Mail\", \"Service\"?
Et c'est la présence ou absence du switch plutôt que \"résultat du switch\"
xaviar écrit:
Oui, si l'objet contenu dans $Result est a également une propriété nommée property, mais là j'ai un doute.et faire mon \"If\" des commutateurs après?
if ($mail) {$Result.Properties.get_item(\"Mail\")} #ou getProperty -Name Mail
De ce que je comprends, seul l'objet primaire posséde une telle propriété. Mais je n'ai pas d'AD pour tester.
xaviar écrit:
L'instruction Switch (et pas le type [Switch]) utilise $_ pour porter la valeur en cours. Et ParameterSetName contient le nom du jeux de paramètre en cours et pas un des paramètres de la fonction.Est-ce du fait de la déclaration [Switch]Mail et Service du début qui m'empêche de faire le Switch sur $PsCmdlet.ParameterSetName?
Un jeux de paramètre permet d'avoir + comportements pour un même cmdlet et on utilise qu'un seul comportement à la fois. C'était une possible solution d'implémentation.
xaviar écrit:
Oui.Le $Mail ne pourra avoir que 2 valeurs? $True ou $False si je comprend bien.
xaviar écrit:
Peut être, dans tout les cas il faut expliciter clairement le(s) comportement(s) que tu veux avoir, le reste c'est de la mécanique.je me suis peut être lancé dans quelque chose qui dépasse de loin mon niveau mais c'est intéressant.
C'est le BA-ba de la conception d'un cmdlet/fonction, il y a de nombreux points à connaitre et à assembler. Dans ton cas il se peut qu'il faille tous les utiliser...
Mais c'est comme tout, quand on ne connait pas qq chose, elle parait souvent 'compliquée'.
Par contre il se peut que je n'ai pas compris ta demande initiale
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Et de préciser celles-ci sur la ligne d'appel de ta fonction ?
Voir aussi la note de la doc de la méthode FindAll()
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Fonction avec Arguments