Question [Résolu] Fonction avec Arguments

Plus d'informations
il y a 8 ans 7 mois #24038 par buissonneau
Réponse de buissonneau sur le sujet Re:Fonction avec Arguments
ah non je pense que j'ai pas compris.
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.

Plus d'informations
il y a 8 ans 7 mois #24039 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Fonction avec Arguments
Version avec des switchs :
[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.

Plus d'informations
il y a 8 ans 7 mois #24040 par buissonneau
Réponse de buissonneau sur le sujet Re:Fonction avec Arguments
Hello Laurent,
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.

Plus d'informations
il y a 8 ans 7 mois #24041 par buissonneau
Réponse de buissonneau sur le sujet Re:Fonction avec Arguments
Oui en faite, le -outvariable n'a pas l'air d'être pris en compte donc le if est traité sur une variable null.<br><br>Message édité par: xaviar, à: 27/07/17 17:02

Francis

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 7 mois #24042 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Fonction avec Arguments
Salut
xaviar écrit:

Merci pour ton temps

De rien :-)

xaviar écrit:

tu rend le paramètre UID obligatoire en entrée.

A toi de voir si c'est vraiment le cas, c'est juste une ébauche.

xaviar écrit:

Après tu ajoutes un switch sur Mail et Service. (qui ne sont que des commutateurs à l'arrivée?)

Oui, le type [Switch] porte bien son nom :-)

xaviar écrit:

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 ?

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

\&quot;UID\&quot; {$objMaRechercheOpenLdap.FindAll() | Where-Object {$_.Properties.get_item(\&quot;uid\&quot;) -eq $UID}}

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.
Je t'ai proposé du code 'générique' sans vraiment tenir compte de ton code initial.

xaviar écrit:

Et du coup il faudrait que j'envoi le résultat du switch dans une variable pour l'utiliser dans le \&quot;If\&quot; des commutateurs \&quot;Mail\&quot;, \&quot;Service\&quot;?

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 c'est la présence ou absence du switch plutôt que \&quot;résultat du switch\&quot;


xaviar écrit:

et faire mon \&quot;If\&quot; des commutateurs après?
if ($mail) {$Result.Properties.get_item(\&quot;Mail\&quot;)} #ou getProperty -Name Mail

Oui, si l'objet contenu dans $Result est a également une propriété nommée property, mais là j'ai un doute.
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:

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?

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.
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:

Le $Mail ne pourra avoir que 2 valeurs? $True ou $False si je comprend bien.

Oui.
xaviar écrit:

je me suis peut être lancé dans quelque chose qui dépasse de loin mon niveau mais c'est intéressant.

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.
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 :ohmy:

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 8 ans 7 mois #24043 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Fonction avec Arguments
Ton objectif est bien de récupérer certaines propriétés uniquement ?
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.

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