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, 873 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 - Active Directory Nummern bearbeiten

gelöst Frage von pixel0815Batch & Shell15 Kommentare

Moinsen zusammen, nach vielem Hin und Her habe bin ich jetzt soweit gekommen und nu hört s gerade irgendwie ...

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 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 ...

Neue Wissensbeiträge
Windows Server

Scheduled Task zum Log - Löschen direkt aus der SCOM Console

Tipp von Juanito vor 1 StundeWindows Server

SCOM Agent Task - Create Log Deletion Job Einleitung: Viele Applikationen und Dienste die auf Servern laufen erstellen Log ...

Humor (lol)

Ratgeber: Die wichtigsten Fragen und Antworten zur neuen Datenschutz-Grundverordnung (DSGVO)

Information von BassFishFox vor 1 StundeHumor (lol)

Hier bleiben keine Fragen offen. ;-)

Humor (lol)
Wieder mal DSGVO
Information von brammer vor 13 StundenHumor (lol)2 Kommentare

Mal was zum Lachen: Der Countdown zur Datenschutz-Grundverordnung läuft. Ab 25. Mai sollte man folgende Regeln beachten: Visitenkarten nur ...

Router & Routing

Cisco Talos deckt riesiges Router- und NAS-Botnetz auf

Tipp von Bosnigel vor 13 StundenRouter & Routing

Anscheinend kommt da wieder was auf uns zu: Gruß Bosnigel

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Powerline über zwei Stockwerke optimieren
gelöst Frage von DultusLAN, WAN, Wireless45 Kommentare

Guten Morgen liebes Forum, ich hätte einmal eine Frage bezüglich Powerline Adapter: Mein Problem ist seit gestern präsent, da ...

HTML
Link nicht vollständig
Frage von jensgebkenHTML32 Kommentare

Hallo Gemeinschaft, ich erstelle mit Word einen Serienbrief, den ich per Mail versende. Nun mein Problem der Wordserienbrief holt ...

Datenschutz
E-Mail Verschlüsselung DSGVO 2018
Frage von SoccerdeluxDatenschutz27 Kommentare

Hallo zusammen, ich verzweifele langsam und wende mich an euch und hoffe vielleicht ein paar Antworten zu finden. Ich ...

Rechtliche Fragen
DISKUSSION: Was bringt der Disclaimer "Wenn Sie nicht der Empfänger sind."
Frage von N8DragonRechtliche Fragen23 Kommentare

So oder ähnlich, lese ich immer wieder Kleingedrucktes am Ende diverser Mails. Letzten Endes wollen sie mir alle sagen, ...