PowerShell Zeichen ab # bis Leerzeichen

Don-DCH

Captain
Registriert
Aug. 2009
Beiträge
3.090
Guten Mittag zusammen,

ich komme einfach nicht weiter, folgende Ausgangssituation. Ich würde gerne bei Gameplay die Parts hochzählen lassen, dafür schaut er in den Ordner, welche Dateien er findet, anbei eine Beispiel Ausgabe:

asterix #1 20-06-2022 19-58-03
asterix #10 23-06-2022 19-58-03
asterix #10 24-06-2022 19-58-03
asterix #2 21-06-2022 19-58-03
asterix #3 22-06-2022 19-58-03
asterix #9 22-06-2022 19-58-03

jetzt würde ich gerne die Zahlen nach der Raute bis zum Datum auslesen unabhängig wie viele es sind und davon dann die höchste Zahl ermitteln.

Mit einem Split kann ich alles vor der Raute entfernen aber er sortiert es immer so wie oben, die 10 wird nicht als 10 erkannt :(

Gibt es eine Möglichkeitalle nachfolgenden Zahlen nach der Raute auszulesen und als Stopper das Leerzeichen zu nehmen?
Zur Not wären auch die nächsten 2 Zahlen ausreichend, das wäre ja entweder ein Leerzeichen oder eine Zahl, so könnte man bis 100 Immerhin das richtige auslesen.

Über Hilfe würde ich mich sehr freuen, bekomme es aktuell nicht hin.
 
Code:
> $string = "asterix #1 20-06-2022 19-58-03"
> $array = $string.Split(" ")
> echo $array[1]
#1

Und dann nen String-replace für # wenn du das nicht willst.
RegEx geht natürlich auch, fänd ich aber etwas overkill hier.

Und ja klar bleibt die Sortierung wie sie ist, weil #1 eben keine Zahl sondern ein String ist, entsprechend wird auch wie ein String sortiert. Da #11 ebenfalls mit #1 beginnt kommt es danach.
 
  • Gefällt mir
Reaktionen: Scientist
burglar225 schrieb:
Danke dir, das schau ich mir mal an.

Mihawk90 schrieb:
Code:
> $string = "asterix #1 20-06-2022 19-58-03"
> $array = $string.Split(" ")
> echo $array[1]
#1

Und dann nen String-replace für # wenn du das nicht willst.
RegEx geht natürlich auch, fänd ich aber etwas overkill hier.

Und ja klar bleibt die Sortierung wie sie ist, weil #1 eben keine Zahl sondern ein String ist, entsprechend wird auch wie ein String sortiert. Da #11 ebenfalls mit #1 beginnt kommt es danach.
Danke dir ebenfalls, das Problem ist, dass ich mit Get Child Item die Abfrage mache und immer die ganze Liste wie oben gezeigt bekomme.

Kleine Ergänzung

$TEST = Get-ChildItem -Path "$ordner\$unterordner" -Filter "$NeuerName"
$Test2 = $Test.Name
$Zahlalt=$TEST2.split("#")[-1]
[string]$R=$Zahlalt[0]
[int]$Zahl=$R


Dann bekomme ich eine Einstellige Zahl raus, aber maximal die 9
Wobei Die Ausgabe der Variable $TEST die obrige Tabelle ist mit weiteren Werten wir Datum.

Mit
$Test2 = $Test.Name
Reduziere ich das ganze auf die obrige Tabelle

Und mit
$Zahlalt=$TEST2.split("#")[-1]
bekomme ich diese ausgabe
9 20-06-2022 13-58-03

Dadurch lese ich die Zahl aus nur eine Stelle:
[string]$R=$Zahlalt[0]

in dem Falle 9

und konvertiere mit
[int]$Zahl=$R
Die Zahl als Int, damit ich dann $Zahl++ machen kann um den Wert um eins zu erhöhen.
Vielleicht würde es auch funktionieren wenn die Sortierung klappen würde und nicht

#1
#10
#11
#2
#3

sortiert werden würde sondern

#1
#2
#3
#10
#11
Als Beispiel, natürlich noch 4-9 inklusive :) habe ich der Übersichtshalber weggelassen.
 
Du kannst den Split auch am Leerzeichen machen (" " statt "#").
Dann enthaelt $Zahlalt[0] "#Zahl".
Das "#" kannst du dann bspw. mit $Zahlalt[0].substring(1) entfernen (entfernt einfach das erste Zeichen).
Somit muss du die Zahl nur noch in ein Integer umwandeln.


Edit:
Falls du die Dateinamen beeinflussen kannst:
Ergaenze die Nummerierung um vorangestellte Nullen.
Dann passt das auch mti der Sortierung.

Also statt "asterix #1 20-06-2022 19-58-03" -> "asterix #001 20-06-2022 19-58-03"
 
Danke dir für die schnelle Anwort!
Asterix war wohl ein schlechtes Beispiel, oft haben die Titel auch mehrere Leerzeichen drinne, daher hatte ich gedacht wäre es am besten nach der Raute zu schauen was danach dann kommt.

Hmm das Format müsste ich mal schauen ob ich das beeinflussen kann. Von der Ansicht gefällt mir das ohne führende Null in jedem Fall besser.

Zwischen Zahl und Datum könnte man noch ein anderes Zeichen einsetzen hmm vielleicht wäre das die Lösung, dass man alles zwischen diesen Zeichen ausliest und sortiert, aber wie hmm
 
Warum lässt du dir nicht die Anzahl der Items im Array anzeigen?
PowerShell:
$TEST = Get-ChildItem -Path "$ordner\$unterordner" -Filter "$NeuerName"
$Zahl = $Test.count

Ansonsten kannst du die Zahlen auch so ermitteln:
PowerShell:
$TEST = Get-ChildItem -Path "$ordner\$unterordner" -Filter $NeuerName
$Zahl = (($TEST.Name | Select-String -Pattern '(?<=asterix #)\d+').Matches.Value).PadLeft(4,'0') | Sort-Object

Oder wenn du nur die höchste haben willst:
PowerShell:
$TEST = Get-ChildItem -Path "$ordner\$unterordner" -Filter $NeuerName
$Zahl = (($TEST.Name | Select-String -Pattern '(?<=asterix #)\d+').Matches.Value).PadLeft(4,'0') | Sort-Object -Descending -Top 1
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Don-DCH und Mihawk90
Hey, danke dir für deine Antwort!

Das mit den Items innerhalb des Arrays ist eine tolle Möglichkeit :)
So einfach aber doch bin ich nicht darauf gekommen :)

Die anderen Lösungen finde ich auch sehr schön, das wäre genau dass, was ich suche.
Leider funktioniert es mit der höchsten Zahl mit -Top 1 nicht :(

Als Workaround habe ich jetzt das geschrieben
$Zahl2 = $TEST2[0]

Durch das Sortieren sollte es ja auch passen :)

Ich habe jetzt einfach mal das asterix weggelassen nach dem <= da es universell für alle gelten soll, soweit sieht es auch so aus als würde es gut funktionieren.

Vielen Herzlichen Dank!
 
Don-DCH schrieb:
Leider funktioniert es mit der höchsten Zahl mit -Top 1 nicht :(
Hmm, evtl. ein Feature von PS 7.0, weis nicht welche Version du einsetzt. Win10 kommt standartmäßig mit 5.1.
Ergänzung ()

Don-DCH schrieb:
So einfach aber doch bin ich nicht darauf gekommen :)
Birgt aber auch Probleme wenn die Anzahl der Dateien nicht mit deinem Zähler übereinstimmen, daher noch das andere Beispiel drunter.
Don-DCH schrieb:
Ich habe jetzt einfach mal das asterix weggelassen nach dem <= da es universell für alle gelten soll, soweit sieht es auch so aus als würde es gut funktionieren.
Ja das ?<= ist der Startpunkt, d.h. wenn nur die # bleibt wird ab dem Zeichen die Zahlen dahinter ausgegeben.
 
  • Gefällt mir
Reaktionen: Don-DCH
Ah guter Hinweis, ja ich verwende Windows 10 mit Power Shell 5.1

Das stimmt, normalerweise sollte die Anzahl der Dateien passen, aber das auslesen wie in deinem Beispiel drunter ist mir lieber und funktioniert sehr gut nach ersten Tests, danke dir :)

Danke auch für die Erklärung, auf den Befehl wäre ich nicht gekommen.
 
Zurück
Oben