Question Retour de fonctions (again) (Résolu)

Plus d'informations
il y a 17 ans 2 mois #3550 par clem
Il y a quelquechose qui m'echappe sur les fonctions

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.

Plus d'informations
il y a 17 ans 2 mois #3551 par clem
Réponse de clem sur le sujet Re:Retour de fonctions (again)
Par ailleurs, j'observe qu'en utilisant un parametre supplementtaire ( -cn $CN ) j'obtient encore un autre type pour $complistgoudurix dans le script :


[code:1]$CN=\&quot;username\&quot;

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

Plus d'informations
il y a 17 ans 2 mois #3552 par Laurent Dardenne
Salut,
clem écrit:

Je seche...Comment reutiliser dans le script la variable $complist cree dans la fonction ? (notemment pour la methode dispose() )

là il faut consulter MSDN, la valeur de retour de FindAll est bien System.DirectoryServices.SearchResultCollection.
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:

Par ailleurs, j'observe qu'en utilisant un parametre supplementtaire ( -cn $CN ) j'obtient encore un autre type pour $complistgoudurix dans le script

Là il faut déjà tracer la valeur de retour dans la fonction.
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é :S

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.

Plus d'informations
il y a 16 ans 9 mois #4778 par steph_d
Réponse de steph_d sur le sujet Re:Retour de fonctions (again)
Bonjour

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 = \&quot;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.

Plus d'informations
il y a 16 ans 9 mois #4780 par Laurent Dardenne
Vérifie le type des objets
[code:1]
function test{
$login = \&quot;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 = \&quot;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.

Plus d'informations
il y a 16 ans 9 mois #4782 par steph_d
Réponse de steph_d sur le sujet Re:Retour de fonctions (again)
J'y comprends rien :angry: j'ai fait un essais avec ta fonction test et c'est ok !

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 = \&quot;SELECT UPLI1 FROM SECAPPLIF.UPROFIP1 WHERE UPTYP='U' AND UPCOD='$login'\&quot;
$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 \&quot;Email Expediteur: $retour\&quot;
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[]:silly:

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.

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