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-Key: 301516

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

Printed on: April 25, 2024 at 06:04 o'clock

Mitglied: 114757
114757 Apr 11, 2016 updated at 17:18:11 (UTC)
Goto Top
powershell -Executionpolicy Bypass -Command "gci *.jpg | sort {$_.Basename.Split('.').PadLeft(5,'0')} -Descending | select -First 1 | %%{[int]($_.BaseName.split('.'))+1}"  
Gruß jodel32
Member: evinben
evinben Apr 11, 2016 at 16:04:47 (UTC)
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 !
Mitglied: 114757
114757 Apr 11, 2016 at 16:06:52 (UTC)
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
Member: evinben
evinben Apr 11, 2016 updated at 16:28:13 (UTC)
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).
Mitglied: 114757
Solution 114757 Apr 11, 2016 updated at 17:17:37 (UTC)
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%
Member: evinben
evinben Apr 11, 2016 updated at 16:42:18 (UTC)
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?
Mitglied: 114757
114757 Apr 11, 2016 at 16:50:59 (UTC)
Goto Top
Sorry hatte deine Dateinamen nicht gesehen, ist korrigiert ...
Mitglied: 114757
Solution 114757 Apr 11, 2016 updated at 17:01:32 (UTC)
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
Member: evinben
evinben Apr 11, 2016 at 17:03:29 (UTC)
Goto Top
mir zeigt es:
">" kann syntaktisch an dieser Stelle nicht verarbeitet werden.  
Mitglied: 114757
114757 Apr 11, 2016 updated at 17:20:12 (UTC)
Goto Top
typo, ist korrigiert ein Prozentzeichen zu wenig, scheixx batch face-wink...
Member: evinben
evinben Apr 11, 2016 at 18:18:46 (UTC)
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!
Member: evinben
evinben Apr 11, 2016 updated at 19:50:42 (UTC)
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...
Mitglied: 114757
114757 Apr 11, 2016 updated at 20:46:16 (UTC)
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.
Member: evinben
evinben Apr 12, 2016 at 05:25:52 (UTC)
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!