Benutzer mit den meisten Antworten
Wie bricht man eine Schleife ab, wenn der Wert gleich $null ist?

Frage
-
Hallo,
ich benötige ein Skript, wo ich prüfen kann, ob das Ergebnis eines Powershell-Befehls gleich $null ist. Die zu prüfenden IDs sind in einem Array. Wenn der Wert nicht existiert, ist das Ergebnis gleich $null und die Schleife soll abgebrochen werden.
Mit meinem Skript wird die Schleife jedoch fortgesetzt:
$uidnumbers = @(1000,2000,3000,4000,5000) foreach ($uid in $uidnumbers) { do { $uidrequest = Get-ADUser -Filter * -Properties uidNumber | select Name, uidNumber | Where-Object {$_.uidNumber -eq $uid} if($uidrequest -eq $null) { Write-Host "The value" $uid "is available." -ForegroundColor Green break } else { Write-Host "The value" $uid "is not available." -ForegroundColor Red continue } } while ($uidrequest -eq $null) }
Was fehlt hier noch?
Antworten
-
Du hast ja auch zwei Schleifen!
Ein Break verlässt nur die aktuelle, aber nicht deinen äußeren Foreach.Ich weiß ja nicht was du mit dem "do while" bezweckst, wenn der get-aduser immer mit denselben Werten arbeitet.
Mach doch einfach mal einen Debug mit der ISE, dann siehst du eher was passiert.
Nach dem was wir da sehen, ist der "do until" überflüssig.
Zumal, wenn ein Ergebnis geliefert wird, bleibt das Script ewig in der Schleife.- Bearbeitet Der Suchende Freitag, 12. März 2021 12:46
- Als Antwort markiert -honeybee- Freitag, 12. März 2021 12:57
Alle Antworten
-
Ich glaube, dein Ergebnis ist nie NULL sondern eher ein leeres Array, also ggf.
Dein Glaube ist leider nur das. Where-Object, bei dem die Bedingung nie zutrifft, hinterlässt $null, im Unterschied zu der .Where() Methode, die immer ein Array zurückgibt.$uidrequest.length -eq 0
Evgenij Smirnov
- Bearbeitet Evgenij Smirnov Freitag, 12. März 2021 11:54
-
Nix. Es funktioniert wie programmiert.
Ich vermute, dass Du die do/while-Schleife komplett entfernen möchtest ;-) Dann wird nämlich bei der ersten grünen Zeile aus der Master-Schleife ausgebrochen.
Evgenij Smirnov
-
Wobei ich das Konstrukt nicht verstehe:
do { $uidrequest = Get-ADUser -Filter * -Properties uidNumber | select Name, uidNumber | Where-Object {$_.uidNumber -eq $uid} if($uidrequest -eq $null) { Write-Host "The value" $uid "is available." -ForegroundColor Green break } else { Write-Host "The value" $uid "is not available." -ForegroundColor Red continue } } while ($uidrequest -eq $null)
Warum bei Null einen Break wenn doch der While bei Null in der Schleife bleiben soll? Wäre da ein Until nicht besser? Dann kann man sich auch Break/Continue sparen.
Was den Break angeht, so kann man dem äußeren Loop einen Label verpassen und dann "break Label" verwenden.
- Bearbeitet Der Suchende Freitag, 12. März 2021 12:11
-
Die do/while Schleife ist komplett überflüssig, denn durch break/continue in der Mitte wird die while-Bedingung ja nie ausgewertet.
Evgenij Smirnov
-
Wäre da ein Until nicht besser?
Bei
foreach ($uid in $uidnumbers) { do { $uidrequest = Get-ADUser -Filter * -Properties uidNumber | select Name, uidNumber | Where-Object {$_.uidNumber -eq $uid} if($uidrequest -eq $null) { Write-Host "The value" $uid "is available." -ForegroundColor Green } else { Write-Host "The value" $uid "is not available." -ForegroundColor Red } } until ($uidrequest -eq $null) }
wird die Schleife fortgesetzt, das heißt, sie bricht nicht ab und der Output ist wiederholt "The value 1000 is not available.".
- Bearbeitet -honeybee- Freitag, 12. März 2021 12:40
-
Du hast ja auch zwei Schleifen!
Ein Break verlässt nur die aktuelle, aber nicht deinen äußeren Foreach.Ich weiß ja nicht was du mit dem "do while" bezweckst, wenn der get-aduser immer mit denselben Werten arbeitet.
Mach doch einfach mal einen Debug mit der ISE, dann siehst du eher was passiert.
Nach dem was wir da sehen, ist der "do until" überflüssig.
Zumal, wenn ein Ergebnis geliefert wird, bleibt das Script ewig in der Schleife.- Bearbeitet Der Suchende Freitag, 12. März 2021 12:46
- Als Antwort markiert -honeybee- Freitag, 12. März 2021 12:57
-
Ist gelöst:
foreach ($uid in $uidnumbers) { $uidrequest = Get-ADUser -Filter * -Properties uidNumber | select Name, uidNumber | Where-Object {$_.uidNumber -eq $uid} if($uidrequest -eq $null) { Write-Host "The value" $uid "is available." -ForegroundColor Green break; } else { Write-Host "The value" $uid "is not available." -ForegroundColor Red } }
Danke für die Hilfe! -
Mal eine Frage:
Wofür verwendest du einen Foreach, wenn du bei dem ersten fehlenden User aufhörst?
Es könnten in der Liste ja noch existierende User folgen.- Bearbeitet Der Suchende Freitag, 12. März 2021 14:09