Question
Retour de fonctions (again) (Résolu)
- clem
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 27
- Remerciements reçus 0
Comme m'indiquai Laurent, j'ai compris q'un
[code:1]return $a[/code:1]
equivaut à
[code:1]$a[/code:1]
Dans mon cas j'ai cette fonction :
[code:1]#Fonction de recherche d'objets dans l'AD
function RechercheAd
{
param ([string]$dc=\"goudurix\" , [string]$path=\"dc=mondomaine,dc=fr\" , [String[]]$Proplist=\"name\" , [string]$searchtype=\"user\", [string]$cn=\"*\"«»)
$ldapQuery = \"(&(objectCategory=$searchtype)(cn=$cn))\"
#requete sur le DC
$de = new-object system.directoryservices.directoryentry (\"LDAP://$dc/$path\"«»)
$ads = new-object system.directoryservices.directorysearcher -argumentlist $de,$ldapQuery
foreach ($i in $PropList){$ads.PropertiesToLoad.Add($i) | Out-Null ; write-host Propriétés de recherche $i ajoutée }
$complist = $ads.findall()
return $complist
}[/code:1]
Cette fonction fait une requete dans l'ad selon les parametres.
Le but est de recuperer dans complist le resultat de la requete et de pouvoir utiliser ce contenu dans le reste du script :
[code:1]$complistgoudurix= RechercheAd -dc goudurix -searchtype $SearchType -path $searchPath -proplist $PropertiesToLoad[/code:1]
Seulement voila : le type de $complist dans la fonction est : System.DirectoryServices.SearchResultCollection
Par contre,dans le script, le type de $complistgoudurix (apres appel de la fonction) est : System.Object[]
Le probleme qui se manifeste est que, du coup,la methode $complistgoudurix.dispose() ne fonctionne plus (ce que je comprend vu le type d'objet et l'erreur qui survient):
[code:1]Method invocation failed because [System.Object[]] doesn't contain a method named 'dispose'.
At :line:90 char:26
+ $complistgoudurix.dispose( <<<< )[/code:1]
Par contre un
[code:1]$complistgoudurix[/code:1]
Affiche bien le contenu de la variable (la requete ad)
Je seche...Comment reutiliser dans le script la variable $complist cree dans la fonction ? (notemment pour la methode dispose() )
Message édité par: clem, à: 23/12/08 11:34
Message édité par: clem, à: 23/12/08 11:36
Message édité par: clem, à: 23/12/08 11:59<br><br>Message édité par: Arnaud, à: 11/06/09 23:22
Connexion ou Créer un compte pour participer à la conversation.
- clem
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 27
- Remerciements reçus 0
[code:1]$CN=\"username\"
##requete de tous les users sur le premier DC
$complistgoudurix = RechercheAd -dc goudurix -searchtype $SearchType -path $searchPath -proplist $PropertiesToLoad -cn $CN[/code:1]
dans le script :
[code:1]Write-Host $complistgoudurix.gettype()
System.DirectoryServices.SearchResult[/code:1]
Je suis perplexe !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
clem écrit:
là il faut consulter MSDN, la valeur de retour de FindAll est bien System.DirectoryServices.SearchResultCollection.Je seche...Comment reutiliser dans le script la variable $complist cree dans la fonction ? (notemment pour la methode dispose() )
Dans ce cas soit typer la variable ou transtyper la valeur de retour mais au vu du second problème la première solution semble être préférable.
clem écrit:
Là il faut déjà tracer la valeur de retour dans la fonction.Par ailleurs, j'observe qu'en utilisant un parametre supplementtaire ( -cn $CN ) j'obtient encore un autre type pour $complistgoudurix dans le script
Logiquement s'il n'y a qu'un élément dans le collection on récupére une collection et pas un objet du type de cette collection. Réessaie en ayant type le résultat mais je partage ta perpléxité
La classe SearchResult encapsule un nœud de la hiérarchie des services de domaine Active Directory qui est retourné lors d'une recherche exécutée par le biais de DirectorySearcher.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- steph_d
- Hors Ligne
- Membre senior
-
- Messages : 65
- Remerciements reçus 0
Je me permets d'enlever les toils d'ariagnées de ce thread car j'ai moi même ce problème qui m'agace au plus au point en plus d'un autre problème.
Pb1:
$login = \"Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; \"
$login = $login.split(';')
$login[0] #Affiche t ????
$login #Affiche Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. ???
return $login
PB2:
Je récupère la valeur de retour et là je me retrouve avec un System.Object[] aussi ! et des choses en plus.
Stephane
@+ Steph
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 test{
$login = \"Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; \"
write-host ($login.GetType())
$login = $login.split(';')
write-host ($login[0])
write-host ($login.GetType())
write-host ($login[0].GetType())
write-host $login
return $login
}
#System.String
#toto@toto.fr
#System.String[]
#System.String
#toto@toto.fr
[/code:1]
Pour le 1er pb en ctp3 je n'ai pas de soucis.
Pour le second pb je pense que c'est du au fonctionnement du pipeline(une opération de boxing ?), dans lequel transitent des objets.
Si tu déclares un type pour la valeur de retour :
[code:1]
[String[]] $result=Test
[/code:1]
Tu n'as pas ce soucis.
Dans l'exemple suivant si on force le type, le type de la variable n'est pas modifié :
[code:1]
$login=$null
$login = \"Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.; \"
[Object[]] $S = $login.split(';')
$s.GetType()
#System.String[]
[/code:1]
Ici la modification du type par le pipe n'intervient pas.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- steph_d
- Hors Ligne
- Membre senior
-
- Messages : 65
- Remerciements reçus 0
Je mets le code exacte de ma fonction qui ne marche pas:
[code:1]
Function LireEmailExpediteur
{
param([String]$login, [System.data.odbc.odbcCommand]$odbc)
$odbc.CommandText = \"SELECT UPLI1 FROM SECAPPLIF.UPROFIP1 WHERE UPTYP='U' AND UPCOD='$login'\"
$DataAdapter = new-object System.Data.odbc.odbcDataAdapter($odbc)
$DataSet = new-object System.Data.DataSet
$DataAdapter.Fill($DataSet)
$retour = $DataSet.Tables[0].Rows[0]
write-host -$retour-
write-host ($retour[0].GetType())
write-host ($retour.GetType())
$retour = $retour.Split(';')
EcrireLog \"Email Expediteur: $retour\"
write-host -$retour-
return $retour
}
[/code:1]
[code:1]
-toto@toto.fr; -
System.Char
System.String
Email Expediteur: Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
-toto@toto.fr -[/code:1]
et la fonction me retourne un System.object[]
L'affichage de $retour me turlupine car en fait il a gardé la deuxième partie, tous les espaces après le séparateur !<br><br>Message édité par: steph_d, à: 9/06/09 15:23
@+ Steph
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Retour de fonctions (again) (Résolu)