Flash info

"Those who forget to script are doomed to repeat their work."

Jeffery Hicks (PowerShell MVP)

 
Accueil arrow Forum

Bienvenue sur le forum PowerShell-Scripting.com

 
Gaby
Utilisateur

PowerShelleur Amateur
Messages: 86
graphgraph
Karma: 3  
Foreach : optimisation des performances - 17/07/07 07:22 Bonjour bonjour, c'est encore moi.
Alors mon probleme actuel c'est que j'execute une requete que voila :

Code:

  $Container "OU=Administration,OU=Groups,OU=Exploitation Users,dc=exploitation,dc=****,dc=***" $GroupDN "CN=" $GroupName "," $Container $requete "LDAP://" $GroupDN $objGroup = [ADSI]$requete $objGroup.GetInfo



Et avec le resultat de ma requete, je fais un foreach pour recuperer un a un les informations

Code:

  foreach ($objMember in $objGroup.Members) { $requete2 "LDAP://" $DCtoUse "/" $objMember.distinguishedName $objUser = new-object System.DirectoryServices.DirectoryEntry $requete2 $objUser.psbase.msExchRecipLimit $NbDestinataire $objUser.setinfo $objuser.CommitChanges() $objMember.distinguishedName out-File $sNomFichier (" ") | out-File $sNomFichier



Mais si je teste avec un write-host, je me rend compte que $objmember est vide.

Merci d'avance.

Message édité par: Arnaud, à: 23/07/07 10:44
Gaby
  | | L'administrateur a désactivé l'accés public en écriture.
Arnaud
Admin

Administrateur
Messages: 1319
graphgraph
Karma: 45  
Re:Foreach - 17/07/07 08:55 Bonjour Gaby,

Je n'ai pas d'AD sous la main mais je pense que ton objet $objgroup.members n'est pas une collection d'objets.

Essaye de faire un get-member dessus pour voir quelles sont ses propriétés et méthodes.

D'autre part j'ai déjà fait un script similaire qui liste le contenu d'un groupe, peut-être pourrais tu t'en inspirer ? C'est ici: http://powershell-scripting.com/index.php?option=com_content&task=view&id=119&Itemid=71

Arnaud
MVP PowerShell (depuis 2007)
Suivez moi sur Twitter !
  | | L'administrateur a désactivé l'accés public en écriture.
janel
Admin

Administrateur
Messages: 576
graphgraph
Karma: 31  
Re:Foreach - 17/07/07 11:47 En complément de la réponse d'Arnaud, j'ajouterai que les performances d'une boucle comme suit ne sont pas optimales:
Code:

  foreach ($object in $collection) {...}


Dans les cas où la collection contient un nombre important d'objets, on aura plutôt intérêt à utiliser la forme suivante:
Code:

  $collection | foreach {...}


Le gain est particulièrement important si vous mettez à la place de $collection la suite de commandes qui génèrent la collection.

Pour plus de détails vous pouvez lire le billet que j'avais publié il y a quelques semaines:

http://janel.spaces.live.com/blog/cns!9B5AA3F6FA0088C2!304.entry

Janel

Message édité par: janel, à: 17/07/07 12:55
  | | L'administrateur a désactivé l'accés public en écriture.
Arnaud
Admin

Administrateur
Messages: 1319
graphgraph
Karma: 45  
Re:Foreach - 17/07/07 12:24 Très intéressant ton billet sur l'optimisation du foreach janel !

Mais dans le cas de Gaby, y a t'il vraiment un gain de performance à tirer en utilisant le pipeline, dans la mesure où tous les objets doivent être parcourus (contrairement à l'exemple que tu as pris sur ton blog) ?

Arnaud
MVP PowerShell (depuis 2007)
Suivez moi sur Twitter !
  | | L'administrateur a désactivé l'accés public en écriture.
Gaby
Utilisateur

PowerShelleur Amateur
Messages: 86
graphgraph
Karma: 3  
Re:Foreach - 17/07/07 12:30 J'ai fait une copie de mon script et dans la copie j'y ai mis le foreach façon "janel" ^^
Des que je serai sur la prod (cette aprem peut etre) je testerai les deux, et je vous dirai si l'une marche mieux que l'autre, ou au moins si l'une marche
Gaby
  | | L'administrateur a désactivé l'accés public en écriture.
Arnaud
Admin

Administrateur
Messages: 1319
graphgraph
Karma: 45  
Re:Foreach - 17/07/07 12:41 Très bonne idée Gaby.

D'ailleurs te propose, si tu peux, de mesurer le temps d'exécution de ton script avec la commandlette "Measure-Command".

Exemple :
Code:

  Measure-Command -expression { for ($i=1;$i -lt 100;$i++){$i} } Days              0 Hours             0 Minutes           0 Seconds           0 Milliseconds      4 Ticks             43092 TotalDays         4.9875E-08 TotalHours        1.197E-06 TotalMinutes      7.182E-05 TotalSeconds      0.0043092 TotalMilliseconds 4.3092



Comme ça on aura une idée concrète du gain de performances obtenu entre les 2 boucles.

Arnaud

Message édité par: Arnaud, à: 17/07/07 14:39
MVP PowerShell (depuis 2007)
Suivez moi sur Twitter !
  | | L'administrateur a désactivé l'accés public en écriture.
janel
Admin

Administrateur
Messages: 576
graphgraph
Karma: 31  
Re:Foreach - 17/07/07 12:58 Le résultat sera intéressant.

Attention, la boucle "façon Janel" n'apporte vraiment une gros gain que si à la place de $collection on met la requête qui est censée récupérer la collection d'objets.

En dehors de cela, le gain dépend vraiment de plusieurs facteurs:

- Comme noté par Arnaud, si le traitement doit être arrêté avant que tous les objets aient été traités, la boucle "façon Janel" sera notablement plus rapide.

- Mais également, si des traitements assez longs doivent être effectués sur chaque objet, la parallélisation des traitements peut y gagner (à voir concrètement selon les cas).

- Dans tous les cas, on notera également un gain notable dans un autre aspect, celui de l'affichage des résultats. La boucle "façon Janel" permettra d'afficher les résultats objet par objet, ce qui peut être un réel plus à l'usage. C'est notamment un bon moyen de voir des erreurs rapidement, au lieu de poireauter longtemps qu'une requête ait récupéré tous les objets avant de commencer à les traiter.

Malheureusement, ce dernier gain n'est pas mesurable car en soi ça n'accélère pas la performance globale.

A suivre donc!

Janel

Message édité par: janel, à: 17/07/07 13:59
  | | L'administrateur a désactivé l'accés public en écriture.
Gaby
Utilisateur

PowerShelleur Amateur
Messages: 86
graphgraph
Karma: 3  
Re:Foreach - 17/07/07 13:03 Verdict entre cette aprem et demain ^^ Gaby
  | | L'administrateur a désactivé l'accés public en écriture.
Arnaud
Admin

Administrateur
Messages: 1319
graphgraph
Karma: 45  
Re:Foreach - 23/07/07 09:43 Alors Mlle Gaby quel est le verdict ?

Tu entretiens le suspense sur le forum...
MVP PowerShell (depuis 2007)
Suivez moi sur Twitter !
  | | L'administrateur a désactivé l'accés public en écriture.
Gaby
Utilisateur

PowerShelleur Amateur
Messages: 86
graphgraph
Karma: 3  
Re:Foreach - 23/07/07 10:10 mon script ne fonctionnant toujours pas, je ne peux pas encore vous dire ^^ Gaby
  | | L'administrateur a désactivé l'accés public en écriture.
© 2020 PowerShell-Scripting.com