Benutzer mit den meisten Antworten
verschachtelte Schleifen

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
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, DenniverBlog: 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.- Als Antwort vorgeschlagen David das Neves Sonntag, 21. Februar 2016 19:09
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 24. Februar 2016 13:45
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
-
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
-
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
-
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, DenniverBlog: 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.- Als Antwort vorgeschlagen David das Neves Sonntag, 21. Februar 2016 19:09
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 24. Februar 2016 13:45