none
verschachtelte Schleifen RRS feed

  • Frage

  • Hallo,

    ich möchte gerne ein kleines Script schreiben, welches folgende Aufgabe erledigen soll:

    1. lese eine Computergruppe aus

    2. lese alle Eigenschaften von jedem Computer aus

    3. prüfe ob 4 Eigenschafen z.B. den Wert OK haben

    4. die Eigenschaften haben eine Abhängigkeit - Ist Wert 1, 2 oder 3 nicht ok, so brauchen die weiteren Eigenschaften nicht mehr geprüft werden und es kann nicht dem nächsten Computer fortgefahren werden.

    Bis jetzt habe ich die Aufgabe so gelöst:

    - lese die Computergruppe ein

    - lese die Namen der Eigenschaften ein

    - Schleife 1: für jeden Computer in der Gruppe

    - lese die Eigenschaften des Computers ein (ca. 50 Eigenschaften)

    - Unterschleife 1: prüfe ob die Eigenschaft 1 vorhanden ist. Wenn die Eigenschaft gefunden wurde, prüfe wie der Wert ist in breche die weitere Suche nach der Eigenschaft 1 ab.

    - Unterschleife 2: prüfe ob die Eigenschaft 2 vorhanden ist. Wenn der 

    - Unterschleife 3: ....

    - Unterschleife 4: ....

    -------------------------------------

    $_Clients     = Get....
    
    Foreach($computername in $_Clients){ 
         $PIs = Get-
         Foreach ($PI in $PIs) {If ($PackageID0 -contains $PI.AssignedObjectId){}}
         Foreach ($PI in $PIs) {If ($PackageID0 -contains $PI.AssignedObjectId){}}
         Foreach ($PI in $PIs) {}
         Foreach ($PI in $PIs) {}
    }

    Wenn eine Eigenschaft gefunden wurde, dann sollen einige Dinge erledigt werden und die Schleife beendet werden. Hat die Eigenschaft einen bestimmte werden, dann sollen auch die weiteren Schleifen für diesen Computer abgebrochen werden.

    Kann ich das geschickter lösen?

    Liebe Grüße

    Norbert

    


    IT Berater

    Freitag, 12. Februar 2016 10:38

Antworten

  • Es ist deutlich effizienter und auch deutlich schneller $PI nur einmal zu durchlaufen:
     
    Foreach($computername in $_Clients){ 
         $PIs = Get-...
    	  Foreach ($PI in $PIs) {
    	     If ($PackageID0 -contains $PI.AssignedObjectId1){ }
    	     if ($PackageID0 -contains $PI.AssignedObjectId2){ }
    	     If ($PackageID0 -contains $PI.AssignedObjectId3){ }
    	     if ($PackageID0 -contains $PI.AssignedObjectId4){ }
    	 }
    }
     

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Sonntag, 21. Februar 2016 14:29
    Moderator

Alle Antworten

  • Hi,

    was hat es denn mit den Eigenschaften auf sich, kannst du hier etwas mehr Details geben?

    Get-ADGroupMember -Identity Gruppennane| Get-ADComputer -Properties * | where {$_.Oper
    atingsystem -like "*Enterprise*"}

    Prinzipiell könnte man anstelle von Schleifen gezielt über Pipes nach den Computern filtern, wie am Beispiel gezeigt.

    Gruß

    Christian


    Christian Groebner MVP Forefront

    Freitag, 12. Februar 2016 11:01
  • Prinzipiell ist es möglich, Objekt-Propertys als Variablen zu speichern und abzurufen. Angenommen, du hast ein Objekt $obj mit den Eigenschaften a, b, c, dann kannst du sie klassisch so abrufen:

    $obj.a
    $obj.b
    $obj.c

    Oder aber auch $property = "a" und dann 

    $obj.$property

    Dann kannst du $property über eine foreach-Schleife befüllen.

    Die Bedingung wäre aber, dass du alle Eigenschaften auf gleiche Art testest.


    • Bearbeitet hpotsirhc Dienstag, 16. Februar 2016 15:11
    Freitag, 12. Februar 2016 12:01
  • Die Abfragen richten sich nicht gegen das AD sondern eine SQL Datenbank. Die Abfragen an sich sind auch schon vorgegeben, so das ich "nur" mit dem Ergebnis der Abfrage arbeiten kann.  Meine Erfahrung bzgl. der Abfrage hat gezeigt, dass eine Abfrage gegen die DB schneller ist, als 4 gezielte Abfrage pro Client. Da werden dann ja auch alle Datensätze gelesen.

    Es handelt sich mit Softwareverteilung DSM 7 und PSX.


    IT Berater

    Freitag, 12. Februar 2016 12:14
  • Es ist deutlich effizienter und auch deutlich schneller $PI nur einmal zu durchlaufen:
     
    Foreach($computername in $_Clients){ 
         $PIs = Get-...
    	  Foreach ($PI in $PIs) {
    	     If ($PackageID0 -contains $PI.AssignedObjectId1){ }
    	     if ($PackageID0 -contains $PI.AssignedObjectId2){ }
    	     If ($PackageID0 -contains $PI.AssignedObjectId3){ }
    	     if ($PackageID0 -contains $PI.AssignedObjectId4){ }
    	 }
    }
     

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Sonntag, 21. Februar 2016 14:29
    Moderator