Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst PowerShell nächste freie Nummer finden

Mitglied: derhoeppi

derhoeppi (Level 2) - Jetzt verbinden

12.10.2015, aktualisiert 13.10.2015, 904 Aufrufe, 12 Kommentare

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:
01.
$arr = @(1,5,3,4,6) 
02.
$ids = $arr | sort 
03.
for($i=0;$i -lt $ids.count;$i++){ 
04.
    if ([int]$ids[$i] -ne [int]($ids[$i+1]-1)){ 
05.
        $nextID = [int]$ids[$i] + 1 
06.
        break 
07.
08.
09.
$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
Mitglied: colinardo
LÖSUNG 12.10.2015, aktualisiert 09.05.2018
Moin,
mal ein etwas anderer Ansatz ... wird ja sonst langweilig
01.
$arr = @(1,5,3,4,6) | sort 
02.
$free = @() 
03.
$count = 4 
04.
# ---- 
05.
[array]$free = @(compare (1..$arr[-1]) $arr -PassThru) 
06.
$next = $arr[-1]+1 
07.
if(($count-$free.length) -gt 0){ 
08.
    1..($count - $free.Length) | %{$free += $next;$next++} 
09.
10.
$free
Grüße Uwe

-edit- Fehler korrigiert (09.05.2018)
Bitte warten ..
Mitglied: derhoeppi
12.10.2015 um 13:31 Uhr
Hallo Uwe,
ich habe in der Zwischenzeit an der alten Schleife weitergearbeitet.

01.
$b = @(a,b,c,d) 
02.
$arr = @(1,3,4,5) 
03.
$ids = $arr | Sort 
04.
Foreach ($c in $b){ 
05.
$ids = $ids | Sort 
06.
for($i=0;$i -lt $ids.count;$i++){ 
07.
    if ([int]$ids[$i] -ne [int]($ids[$i+1]-1)){ 
08.
        $nextID = [int]$ids[$i] + 1 
09.
        $ids += $nextID 
10.
        break; 
11.
    }	 
12.
13.
$nextID 
14.
}
Nun habe ich folgendes Problem. Im $arr befinden sich leider nicht nur „saubere“ Zahlen, sondern auch Zahlen mit einer oder zwei führenden Nullen. Aus diesem Grund erhalte ich bei bestimmten Zahlen Probleme. Im konkreten ist das mein Array $arr=@(02,50,60,61) . In dem oben dargestellten Code erhalte ich als $nextID in der Reihenfolge die Zahlen 1, 3, 1, 2. Dies geschieht aus meiner Sicht durch die führende 0. Wie kann ich diese entfernen?
Gruß
derhoeppi
Bitte warten ..
Mitglied: 114757
12.10.2015, aktualisiert um 13:52 Uhr
Moin derhoeppi
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
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
Bitte warten ..
Mitglied: derhoeppi
12.10.2015 um 15:22 Uhr
Hallo jodel,

ich habe nun Uwe sein Beispiel abgetippt und getestet. Als Ergebnis erhalte ich jedoch Zahlen zwischen 3 und 59. Derzeit durchlaufe ich eben die foreach Schleife. In jedem Durchlauf der foreach Schleife benötige ich eine freie Zahl, die nicht bereits in dem $arr vorhanden ist.

Gruß
derhoeppi
Bitte warten ..
Mitglied: 114757
12.10.2015, aktualisiert um 15:35 Uhr
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.
Bitte warten ..
Mitglied: derhoeppi
12.10.2015 um 16:22 Uhr
Hallo,
ich habe tatsächlich einen Fehler beim Abtippen gehabt. Ich habe nun den Teil in meinem Skript übernommen und an die foreach Schleife angepasst.

Danke

Gruß
derhoeppi
Bitte warten ..
Mitglied: colinardo
12.10.2015 um 18:19 Uhr
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Bitte warten ..
Mitglied: derhoeppi
09.05.2018, aktualisiert um 08:07 Uhr
Hallo Uwe,

für mein Skript habe ich mich damals für deinen Code entschieden und dieser funktionierte nun fast 2,5 Jahre fehlerfrei. Der Code
01.
$arr = @(1,5,3,4,6) | sort 
02.
$free = @() 
03.
$count = 4 
04.
# ---- 
05.
$free = [array](compare (1..$arr[-1]) $arr -PassThru) 
06.
$next = $arr[-1]+1 
07.
if(($count-$free.length) -gt 0){ 
08.
    1..($count - $free.Length) | %{$free += $next;$next++} 
09.
10.
$free
macht jetzt aber Probleme, weil das $arr keine freien Zahlen mehr hat. Das bedeutet im Beispiel des Codes das $arr = @(1,2,3,4,5,6) voll ist. Die Variable $next spuckt mir folgerichtig die 7 als nächste freie Zahl aus, aber $free wird mit der Zahl 24 zurückgegeben.
Wie kann ich mir nun die nächsten freien Zahlen anhand des $count ausgeben lassen bzw. diese in $free speichern? Am liebsten wäre es mir, wenn er mit die nächsten 4 Zahlen aus dem $free und $next generiert.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 09.05.2018, aktualisiert um 10:04 Uhr
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:
[array]$free = @(compare (1..$arr[-1]) $arr -PassThru)
Sorry.

Grüße Uwe

p.s. ich werden es oben im Ursprungsbeitrag noch korrigieren.
Bitte warten ..
Mitglied: derhoeppi
17.05.2018 um 07:42 Uhr
Hallo Uwe,

in dem obigen Beispiel funktioniert es und ich war damit in meinen Tests auch glücklich. Nun arbeite ich es wieder in meinen gesamtes Skript ein und es funktioniert nicht. Dafür habe ich folgendes Problem ausgemacht. Die Elemente vom $arr werden nicht vom Typ Integer ausgegeben, sondern als String. Das macht dahingehend Sinn, weil ich eine Liste von Systemnamen einlese, die eine fortlaufende Zahl besitzen. Über die Methode TrimStart entferne ich das Präfix, so dass nur noch die Zahlen übrig bleiben. Ich schreibe das Ergebnis von der TrimStart Methode in ein neues Array. Bisher hat es funktioniert.

Komisch ist, dass wenn das $arr aus den Zahlen 1 und 10 besteht, die Interpretation des Arrays auf Integer fällt. Habe ich keine Zahl mehr frei also 1 bis 10 dann interpretiert er es als String.
Hast du einen Tipp wie ich sicherstellen kann, dass die Zahlen, die ich mit der Methode TrimStart gewinne auf jeden Fall als Integer im Array landen?
Bitte warten ..
Mitglied: colinardo
LÖSUNG 17.05.2018, aktualisiert um 08:18 Uhr
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 .
Bitte warten ..
Mitglied: derhoeppi
17.05.2018 um 08:28 Uhr
Hallo Uwe,

ich habe gerade im Hintergrund daran gearbeitet und habe die Lösung ebenfalls gefunden. Das Array wird nun so deklariert [int[]]$arr . Und nun funktioniert es endlich wieder.

Vielen Dank für deine Unterstützung.
Bitte warten ..
Ähnliche Inhalte
Exchange Server

Powershell UM Nummer Mitarbeitet per powershell auslesen ?

gelöst Frage von 116480Exchange Server3 Kommentare

Hallo, ich kann ich eigentlich per Powershell die UM Nummer eines Mitarbeiters auslesen . Exchange 2007. Oder diese per ...

Batch & Shell

PowerShell Wert in Array finden

gelöst Frage von derhoeppiBatch & Shell7 Kommentare

Hallo, in meinem Projekt lese ich einen Eintrag aus einer Combobox aus. Dieser wird in eine Variable / Objekt ...

Windows 10

Batch Datei automatisch 1 Ordner anlegen mit nächster freier Nummer, darin Unterordner und eine Excel-Datei

gelöst Frage von Rookie68Windows 105 Kommentare

Hallo erstmal! bisher habe ich noch keine passende Lösung gefunden: eine Batch-Datei soll beim Aufruf in Ihrem Ordner (z.B. ...

Batch & Shell

PowerShell - Finden eines Array Elements

gelöst Frage von derhoeppiBatch & Shell2 Kommentare

Hallo, es gibt Sachen, die man schon mehrmals getan hat, aber es will einfach nicht funktionieren. Ich habe ein ...

Neue Wissensbeiträge
Backup

2016 - Restore mit WBAdmin - iSCSI Device als Sicherungsziel

Erfahrungsbericht von Henere vor 1 TagBackup1 Kommentar

Servus zusammen, was mich eben einige graue Haare gekostet hat Server 2016. Ich habe meinem Server eine weitere M2 ...

Humor (lol)
(Part num your Hacked phone. +XX XXXXXX5200)
Erfahrungsbericht von Henere vor 3 TagenHumor (lol)7 Kommentare

Mein Handy hat aber ne ganz andere Endnummer. Muss ich mir jetzt Sorgen machen ? :-) Vielleicht betrifft es ...

Exchange Server

Letztes Update für Exchange 2016 CU9 war in gewisser Weise destruktiv

Erfahrungsbericht von DerWoWusste vor 3 TagenExchange Server9 Kommentare

Kurzer Erfahrungsbericht zu Exchange2016-KB4340731-x64 Der Exchangeserver hat wie gewöhnlich versucht, es in der Nacht automatisch zu installieren - abgesehen ...

Erkennung und -Abwehr

Neue Sicherheitslücke Foreshadow (L1TF) gefährdet fast alle Intel-Prozessoren

Information von Frank vor 4 TagenErkennung und -Abwehr3 Kommentare

Eine neue Sicherheitslücke, genannt Foreshadow (alias L1TF) wurde auf der Usenix Security 18 von einem Team internationaler Experten veröffentlicht. ...

Heiß diskutierte Inhalte
E-Mail
Deutsche e-Mail Adresse auf iPhone in Katar. Nur Probleme
Frage von vanTastE-Mail15 Kommentare

Moin, ich habe hier in Deutschland auf einem Exchange 2013 eine e-Mail Adresse (name@domain.de) für einen Kollegen in Katar ...

Windows Server
Server 2016 Autotiering Storage Space
Frage von HenereWindows Server11 Kommentare

Servus, ich habe jetzt ein StorageSpace auf einem Server 2016 in Betrieb zum Testen. 1x M2 mit 512GB (970pro) ...

Netzwerke
SSH - Wieso werde ich nach VPN Verbindung rausgeschmissen?
Frage von VernoxVernaxNetzwerke10 Kommentare

Hallo, ich habe es endlich geschafft mein Handy mit einer VPN Verbindung an meinen Router anzuschließen. Nach der Login ...

Hyper-V
Hyper-V keinen Zugriff auf USB Gerät über USB Server
Frage von Barns83Hyper-V10 Kommentare

Normal bin ich ein stiller Leser und wühle mich im normal Fall durch Foren oder schau durch meine Bücher. ...