Mit DIR-Befehl Zahlen normal literarisch sortieren
Hallo,
in einem Verzeichnis muss geprüft werden welche JPG-Datei die höchste Zahl hat am Anfang im Dateinamen hat und dazu dann eins addieren, um nächste neue JPG-Datei mit einer höheren Zahl schreiben zu können:
z. B.
1. DateTime.jpg
5. DateTime.jpg
10. DateTime.jpg
101. DateTime.jpg
123. DateTime.jpg
150. DateTime.jpg
Der Code funktioniert soweit bis die Zahl 10 kommt . Danach geht es nicht, weil beim DIR-Befehl 10 kleiner 2 ist usw. für restlichen Zahlen mit darauffolgender Null (30<4 ...), was hier alles durcheinander bringt (weil die Sortierung "alphabetisch" ist und nicht numerisch literarisch)
Gibt es irgendeinen eleganten einfachen Trick dies leicht umzugehen (z. B. den DIR-Befehl an einen anderen Befehl umzuleiten, von etwa DIR ... | SORT ...) ?
Ich will nicht, dass wegen so einer Kleinigkeit die Batch gleich explodiert, etwa wie hier...
supportnet.de/fresh/2007/12/id1647010.asp
Danke schön
Gruß
evinben
in einem Verzeichnis muss geprüft werden welche JPG-Datei die höchste Zahl hat am Anfang im Dateinamen hat und dazu dann eins addieren, um nächste neue JPG-Datei mit einer höheren Zahl schreiben zu können:
z. B.
1. DateTime.jpg
5. DateTime.jpg
10. DateTime.jpg
101. DateTime.jpg
123. DateTime.jpg
150. DateTime.jpg
for /f "tokens=1 delims=." %%g in ('dir /b /o:-n "*.jpg"2^>nul') do (
echo "%%g"
set /A NextNumber=%%g+1 && goto :NEXT
)
Der Code funktioniert soweit bis die Zahl 10 kommt . Danach geht es nicht, weil beim DIR-Befehl 10 kleiner 2 ist usw. für restlichen Zahlen mit darauffolgender Null (30<4 ...), was hier alles durcheinander bringt (weil die Sortierung "alphabetisch" ist und nicht numerisch literarisch)
Gibt es irgendeinen eleganten einfachen Trick dies leicht umzugehen (z. B. den DIR-Befehl an einen anderen Befehl umzuleiten, von etwa DIR ... | SORT ...) ?
Ich will nicht, dass wegen so einer Kleinigkeit die Batch gleich explodiert, etwa wie hier...
supportnet.de/fresh/2007/12/id1647010.asp
Danke schön
Gruß
evinben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 301516
Url: https://administrator.de/forum/mit-dir-befehl-zahlen-normal-literarisch-sortieren-301516.html
Ausgedruckt am: 25.12.2024 um 17:12 Uhr
14 Kommentare
Neuester Kommentar
powershell -Executionpolicy Bypass -Command "gci *.jpg | sort {$_.Basename.Split('.').PadLeft(5,'0')} -Descending | select -First 1 | %%{[int]($_.BaseName.split('.'))+1}"
Zitat von @evinben:
ops Sorry, ich habe zwar die Kategorie "Batch & Shell" gewählt, aber ich bleibe lieber bei Batch, weil bei mir alles Batch ist.
Kannst du so in deine Batch einfügen, läuft ops Sorry, ich habe zwar die Kategorie "Batch & Shell" gewählt, aber ich bleibe lieber bei Batch, weil bei mir alles Batch ist.
Einfach das ganze Konstrukt in eine FOR-Schleife packen:
for /f "delims=" %%a in ('powershell -Executionpolicy Bypass -Command "gci *.jpg | sort {$_.Basename.Split('.').PadLeft(5,'0')} -Descending | select -First 1 | %%{[int]($_.BaseName.split('.'))+1}"') do set nextnumber=%%a
echo %nextnumber%
Sorry hatte deine Dateinamen nicht gesehen, ist korrigiert ...
Mit Batch ginge z.B. auch das hier:
@echo off & setlocal enabledelayedexpansion
set max=0
for /f "tokens=1 delims=." %%a in ('dir /b "*.jpg"') do (if %%a GTR !max! set max=%%a)
set /a max+=1
echo !max!
pause
typo, ist korrigiert ein Prozentzeichen zu wenig, scheixx batch ...
Naja das stand ja nicht in deinen ursprünglichen Anforderungen ist aber kein Beinbruch ...
Die Batch gebe ich dir als Hausaufgabe, du sollst ja auch noch was Spaß haben
Tipp: Das Ergebnis des Dir Befehl an findstr pipen um gewünschte Dateien auszufiltern....
Regex-String:
Das sollte dich zur Lösung führen.
for /f "delims=" %%a in ('powershell -Executionpolicy Bypass -Command "gci *.jpg | ?{$_.Basename -match '^\d+\.'} | sort {$_.Basename.Split('.').PadLeft(5,'0')} -Descending | select -First 1 | %%{[int]($_.BaseName.split('.'))+1}"') do set nextnumber=%%a
echo %nextnumber%
Tipp: Das Ergebnis des Dir Befehl an findstr pipen um gewünschte Dateien auszufiltern....
Regex-String:
"^[0-9]*\."
Das sollte dich zur Lösung führen.