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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 301516
Url: https://administrator.de/contentid/301516
Printed on: July 27, 2024 at 12:07 o'clock
14 Comments
Latest comment
![Mitglied: 114757 Mitglied: 114757](/images/members/profile_male_64x64.png)
powershell -Executionpolicy Bypass -Command "gci *.jpg | sort {$_.Basename.Split('.').PadLeft(5,'0')} -Descending | select -First 1 | %%{[int]($_.BaseName.split('.'))+1}"
![Mitglied: 114757 Mitglied: 114757](/images/members/profile_male_64x64.png)
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.
![Mitglied: 114757 Mitglied: 114757](/images/members/profile_male_64x64.png)
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%
![Mitglied: 114757 Mitglied: 114757](/images/members/profile_male_64x64.png)
Sorry hatte deine Dateinamen nicht gesehen, ist korrigiert ...
![Mitglied: 114757 Mitglied: 114757](/images/members/profile_male_64x64.png)
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
![Mitglied: 114757 Mitglied: 114757](/images/members/profile_male_64x64.png)
typo, ist korrigiert ein Prozentzeichen zu wenig, scheixx batch
...
![Mitglied: 114757 Mitglied: 114757](/images/members/profile_male_64x64.png)
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 ![face-smile face-smile](/images/icons/fa/light/face-smile.svg)
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.