PowerShell nächste freie Nummer finden
Hallo,
vor einem knappen Jahr hat mich Uwe bereits einmal zu dem Thema unterstützt. Ich möchte die damalige Anforderung noch einmal erweitern.
Anforderung konnte damals so umgesetzt werden:
Nun habe ich eine Array dessen Count in einer Variable steht. Anhand dieser Variable möchte ich nun die nächsten x (Count-Wert) freien Nummern erhalten. In dem Array von oben sollten z.B. die Nummern 2,7,8,9 bei einem Count Wert von 4 zurückgegeben werden.
Gruß
derhoeppi
vor einem knappen Jahr hat mich Uwe bereits einmal zu dem Thema unterstützt. Ich möchte die damalige Anforderung noch einmal erweitern.
Anforderung konnte damals so umgesetzt werden:
$arr = @(1,5,3,4,6)
$ids = $arr | sort
for($i=0;$i -lt $ids.count;$i++){
if ([int]$ids[$i] -ne [int]($ids[$i+1]-1)){
$nextID = [int]$ids[$i] + 1
break
}
}
$nextID
Nun habe ich eine Array dessen Count in einer Variable steht. Anhand dieser Variable möchte ich nun die nächsten x (Count-Wert) freien Nummern erhalten. In dem Array von oben sollten z.B. die Nummern 2,7,8,9 bei einem Count Wert von 4 zurückgegeben werden.
Gruß
derhoeppi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 285331
Url: https://administrator.de/contentid/285331
Ausgedruckt am: 05.11.2024 um 06:11 Uhr
12 Kommentare
Neuester Kommentar
Moin,
mal ein etwas anderer Ansatz ... wird ja sonst langweilig
Grüße Uwe
-edit- Fehler korrigiert (09.05.2018)
mal ein etwas anderer Ansatz ... wird ja sonst langweilig
$arr = @(1,5,3,4,6) | sort
$free = @()
$count = 4
# ----
[array]$free = @(compare (1..$arr[-1]) $arr -PassThru)
$next = $arr[-1]+1
if(($count-$free.length) -gt 0){
1..($count - $free.Length) | %{$free += $next;$next++}
}
$free
-edit- Fehler korrigiert (09.05.2018)
Moin derhoeppi
Das geht so in der Art wie du das hier mit zwei Schleifen versuchst nicht.
@colinardo's Vorschlag geht hier im Test bei mir ...
Gruß jodel32
Dies geschieht aus meiner Sicht durch die führende 0. Wie kann ich diese entfernen?
nope, glaube ich nicht, denn die Zahlen werden ja mit [int] in Integer umgewandelt. Kannst du ja mal selber probieren[int]02
@colinardo's Vorschlag geht hier im Test bei mir ...
Gruß jodel32
Hmm hier nicht , wahrscheinlich ein Fehler beim abtippen ...
Mein Array
3,5,6,7
Dann bei $count = 4 Ausgabe:
1,2,4,8
Du wollest doch wenn weniger als Count vorhanden sind mit dem höchsten Wert es Arrays weiter gemacht wird, hier ist also die 8 zusätzlich dazu gekommen da nicht mehr Lücken drin waren.
Mein Array
3,5,6,7
Dann bei $count = 4 Ausgabe:
1,2,4,8
Du wollest doch wenn weniger als Count vorhanden sind mit dem höchsten Wert es Arrays weiter gemacht wird, hier ist also die 8 zusätzlich dazu gekommen da nicht mehr Lücken drin waren.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Hallo @derhoeppi .
Uups . Das kommt wegen dem Compare. Das liefert $null statt einem leeren Array zurück wenn das Array übereinstimmt und dann wird natürlich bei dem Operator += eine Addition von Zahlen angenommen statt dem Hinzufügen als Array Element.
Um dass zu fixen reicht es wenn man in Zeile die den Rückgabewert der Variablen zwingend als Array deklariert:
Sorry.
Grüße Uwe
p.s. ich werden es oben im Ursprungsbeitrag noch korrigieren.
Uups . Das kommt wegen dem Compare. Das liefert $null statt einem leeren Array zurück wenn das Array übereinstimmt und dann wird natürlich bei dem Operator += eine Addition von Zahlen angenommen statt dem Hinzufügen als Array Element.
Um dass zu fixen reicht es wenn man in Zeile die den Rückgabewert der Variablen zwingend als Array deklariert:
[array]$free = @(compare (1..$arr[-1]) $arr -PassThru)
Sorry.
Grüße Uwe
p.s. ich werden es oben im Ursprungsbeitrag noch korrigieren.
TrimStart hat als Output den Typ String, ergo ist das Ergebnis davon ein String und kein Integer. Also musst du den String wieder in einen Integer wandeln indem du die String Variable entweder explizit mit [int] prefixt oder eben die Convert-Methoden dazu benutzt. Powershell macht zwar vieles implizit aber du musst darauf achten mit welchen Typen du hantierst .