evinben
Goto Top

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

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 face-wink. 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

Content-ID: 301516

Url: https://administrator.de/contentid/301516

Ausgedruckt am: 24.11.2024 um 12:11 Uhr

114757
114757 11.04.2016 aktualisiert um 19:18:11 Uhr
Goto Top
powershell -Executionpolicy Bypass -Command "gci *.jpg | sort {$_.Basename.Split('.').PadLeft(5,'0')} -Descending | select -First 1 | %%{[int]($_.BaseName.split('.'))+1}"  
Gruß jodel32
evinben
evinben 11.04.2016 um 18:04:47 Uhr
Goto Top
ops Sorry, ich habe zwar die Kategorie "Batch & Shell" gewählt, aber ich bleibe lieber bei Batch, weil bei mir alles Batch ist.
Aber danke dir jodel32@ für deine superschnelle Antwort !
114757
114757 11.04.2016 um 18:06:52 Uhr
Goto Top
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 face-smile
evinben
evinben 11.04.2016 aktualisiert um 18:28:13 Uhr
Goto Top
ah so alles klar face-wink
aber wie setzt man das Ergebnis in eine Variable, um es im Batch weiter zu verarbeiten? (ich bin mit dem Powershellchen einfach noch nicht befreundet).
114757
Lösung 114757 11.04.2016 aktualisiert um 19:17:37 Uhr
Goto Top
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%
evinben
evinben 11.04.2016 aktualisiert um 18:42:18 Uhr
Goto Top
aha, OK. Dann muss es werden.
Mir zeigt es allerdings "10" für Datei "9.*JPG", obwohl eine Datei mit einer höheren Zahl 30 im selben Verzeichnis vorhanden ist ("30.*JPG").

Übrigens: Könnte hierfür der SORT-Befehl nicht in Verbindung mit DIR benutzt werden, um das Ergebnis zu erreichen?
114757
114757 11.04.2016 um 18:50:59 Uhr
Goto Top
Sorry hatte deine Dateinamen nicht gesehen, ist korrigiert ...
114757
Lösung 114757 11.04.2016 aktualisiert um 19:01:32 Uhr
Goto Top
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
evinben
evinben 11.04.2016 um 19:03:29 Uhr
Goto Top
mir zeigt es:
">" kann syntaktisch an dieser Stelle nicht verarbeitet werden.  
114757
114757 11.04.2016 aktualisiert um 19:20:12 Uhr
Goto Top
typo, ist korrigiert ein Prozentzeichen zu wenig, scheixx batch face-wink...
evinben
evinben 11.04.2016 um 20:18:46 Uhr
Goto Top
also jetzt haben wir zwei funktionierende Lösungen face-smile, ein mal schön kompakt per Batch und ein mal zu mit zu viel ausgedehntem Powershell face-wink
Danke dir!
evinben
evinben 11.04.2016 aktualisiert um 21:50:42 Uhr
Goto Top
es funktioniert so leider nicht ganz sauber, weil sobald im Verzeichnis andere JPG-Dateien ohne führender Zahl vorhanden sind, aber im Namen Zahlen haben (z. B. "Notiz Nr. 1003_2016.JPG" anstatt etwa wie "12. Screenshot_11.04.2016_21.45.JPG"), dann stuft der IF-Vergleichsoperator die Datei fälschlicherweise größer oder kleiner ein und haut dann alles durcheinander...
114757
114757 11.04.2016 aktualisiert um 22:46:16 Uhr
Goto Top
Naja das stand ja nicht in deinen ursprünglichen Anforderungen face-wink ist aber kein Beinbruch ...
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%
Die Batch gebe ich dir als Hausaufgabe, du sollst ja auch noch was Spaß haben face-smile

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.
evinben
evinben 12.04.2016 um 07:25:52 Uhr
Goto Top
die Hausaufgabe hat mir gefallen face-wink

set max=0
for /f "tokens=1 delims=." %%a in ('dir /b "*.jpg"2^>nul ^|findstr "^[0-9]*\."') do (  
	if %%a GTR !max! set max=%%a
	)
set /a max+=1

Hat spaß gemacht!