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, 986 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
Batch & Shell

Powershell Skript - Find user who created an ad object

gelöst Frage von pixel0815Batch & Shell5 Kommentare

Hallo zusammen, ich hab ein Script gefunden das mir eigentlich ganz gut gefällt, aber ich weiß nicht so recht ...

Batch & Shell

(Batch): "Find" Befehl nach aktuellem Datum filtern

gelöst Frage von unauthorized-userBatch & Shell3 Kommentare

Guten Morgen an alle, für die Dokumentation der Server-Updates habe ich eine winzige *.Bat-Datei geschrieben, welche mir alle installierten ...

Windows Server

Powershell logfile nach Datei suchen

Frage von krischeuWindows Server2 Kommentare

Hi, ich suche nach einer Möglichkeit, das weggespeicherte Logfile auszulesen und zwar nach Zugriff auf eine bestimmte Datei. Das ...

Batch & Shell

Powershell - HL7 - Export nach CSV

gelöst Frage von internet2107Batch & Shell1 Kommentar

Folgendes Problem. Es geht um das Einlesen einer HL7 Datei, die zu einer CSV-Datei exportiert/umgewandelt werden soll. Die einzulesende ...

Neue Wissensbeiträge
Internet

Kommentar: Bundesregierung erwägt Ausschluss von Huawei im 5G-Netz - Unsere Presse wird immer sensationsgieriger

Information von Frank vor 23 StundenInternet4 Kommentare

Hier mal wieder ein schönes Beispiel für fehlgeleiteten Journalismus und Politik zugleich. Da werden aus Gerüchten plötzlich Fakten, da ...

Windows 10

Netzwerk-Bug in allen Windows 10-Versionen durch Januar 2019-Updates

Information von kgborn vor 1 TagWindows 101 Kommentar

Nur ein kurzer Hinweis für Admins, die Windows 10-Clients im Portfolio haben. Mit den Updates vom 8. Januar 2019 ...

Windows 10

Windows 10 V1809: Rollout ist gestartet - kommt per Windows Update

Information von kgborn vor 1 TagWindows 102 Kommentare

Eine kurze Information für die Admins, die Windows 10 im Programm haben. Microsoft hat die letzte Baustelle (die Inkompatibilität ...

Sicherheit

Heise Beitrag Passwort-Sammlung mit 773 Millionen Online-Konten im Netz aufgetaucht

Information von Penny.Cilin vor 1 TagSicherheit6 Kommentare

Auf Heise Online ist folgender Beitrag veröffentlicht worden: Heise Beitrag passwörter geleakt Ich bin mir jetzt nicht ganz sicher, ...

Heiß diskutierte Inhalte
Batch & Shell
Mit findstr batch doppelte zeilen einer txt löschen
Frage von Burningx2Batch & Shell24 Kommentare

Hi Vor einer weile habe ich im netzt einen windows shell befehl gefunden mit welchem man über die konsole ...

Verschlüsselung & Zertifikate
Netzwerkfreigabe Verschlüsselung
Frage von grill-itVerschlüsselung & Zertifikate20 Kommentare

Moin zusammen, sicher nutzen hier die ein oder anderen ein Produkt zur Verschlüsselung von Netzwerkfreigaben/-laufwerken auf denen hochsensible Daten ...

Windows Server
Client in die Domäne einbinden - Allgemeine Frage dazu
gelöst Frage von RalphTWindows Server19 Kommentare

Moin, ich habe 2 DCs in einer Hauptstelle und 2 DCs in einer Nebenstelle. Ich bringe in der Hauptstelle ...

Debian
OpenSSH Login mit Public Key schlägt fehl, mit Passwort funktioniert
gelöst Frage von DKowalkeDebian19 Kommentare

Hallo zusammen, ich hatte hier schon nach einer Anleitung für einen SFTP Server mit Linux gefragt, habe dort auch ...