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

Batch & Shell

Powershell Freier Speicher mit PC-Namensverknüfung

gelöst Frage von HanutaBatch & Shell2 Kommentare

Hallo Zusammen, Habe einen PS-Skript gebastelt, der mir per Remote über WMI den Freien Speicher von C:\ anzeigen soll. ...

Neue Wissensbeiträge
Windows Userverwaltung

Passwortwechsel in der Domain bei Anmeldung erzwingen

Anleitung von Looser27 vor 7 MinutenWindows Userverwaltung

Nachdem es immer wieder User geschafft haben, sich während des laufenden Betriebes auszusperren, habe ich nach einer Möglichkeit gesucht, ...

Ausbildung

Linux-Ausstieg in Niedersachsen - Windows statt Bugfix

Information von StefanKittel vor 3 TagenAusbildung37 Kommentare

Sind ja nur Steuergelder

Speicherkarten

Neuer Speicherkartentyp - zunächst nur für Huawei-Smartphones (künftig auch für Notebooks u. Tablets?)

Tipp von VGem-e vor 4 TagenSpeicherkarten6 Kommentare

Servus, als ob das "Chaos" i.S. Speicherkarten noch nicht groß genug wäre?! Evtl. kommt dieser neue Kartentyp bald auch ...

Sicherheit

Diverse D-Link-Router durch drei Schwachstellen kompromittierbar

Information von kgborn vor 5 TagenSicherheit1 Kommentar

Hat jemand D-Link-Router in Verwendung? Einige Modelle sind sicherheitstechnisch offen wie ein Scheunentor. Äußerst unschöne Sache, aber nichts neues ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Passwortwechsel Zeitpunkt festlegen
Frage von Looser27Windows Userverwaltung27 Kommentare

Guten Morgen liebe Kolleginnen und Kollegen, da es eine Userin in meinem Urlaub geschafft hat, sich vom AD vollständig ...

Windows Server
Probleme im AD am Außenstandort
gelöst Frage von emeriksWindows Server19 Kommentare

Hi, wir haben ein Problem mit AD und GPO am Außenstandort und ich stehe momentan mächtig auf dem Schlauch. ...

Microsoft
Netzlaufwerksordner Berechtigungen Speichern unter aus Programmen
Frage von ITler7Microsoft15 Kommentare

Moin, bin in ein neues Unternehmen eingetreten und habe die Anforderung bekommen Berechtigungen auf einige Ordner anzupassen, da bisher ...

CMS
Seltsame Joomla-Meldung auf unserer WebSite
Frage von Winfried-HHCMS14 Kommentare

Hallo in die Runde! Kennt sich jemand mit Joomla aus? Im Backend unserer WebSite lesen wir seit einiger Zeit ...