Batch-Skript Schleife älteste Datei umbenennen
Hallo zusammen,
Ich möchte per Batch-Skript folgendes umsetzen:
Bis jetzt erarbeitet und ergoogelt habe ich folgendes:
Leider bleiben die Variablen leer bzw enthalten nicht den gewünschten Dateinamen.
Ich würde mich sehr über eure Hilfe freuen. Vielen Dank schon mal!
Ich möchte per Batch-Skript folgendes umsetzen:
- älteste Datei in einem Ordner finden
- Datei umbenennen: vom Dateinamen die letzten 14 Stellen abschneiden
- etwas mit Datei machen (unerheblich für die Frage)
- Datei löschen
Bis jetzt erarbeitet und ergoogelt habe ich folgendes:
@echo on & setlocal
set Ordner="C:\Users\xxx\Desktop\test\"
for %%a in ('dir %Ordner% /b /od') do (
set oldest=%%a
set newName=%oldest:~-14%
ren "%%a" "%newName%"
echo "Mache etwas mit %%a"
....
del /Q"%newName%"
)
Leider bleiben die Variablen leer bzw enthalten nicht den gewünschten Dateinamen.
Ich würde mich sehr über eure Hilfe freuen. Vielen Dank schon mal!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 353595
Url: https://administrator.de/contentid/353595
Ausgedruckt am: 23.11.2024 um 10:11 Uhr
9 Kommentare
Neuester Kommentar
Innerhalb von FOR-Schleifen gesetzte Variablen müssen über Delayed Expansion oder call set aufgelöst werden, das sollte seit bestehen von Batch vor zig Jahrzehnten eigentlich laaaaaaange bekannt sein !
Das ist hier aber nicht nötig wenn man es stattdessen so macht:
Das ist hier aber nicht nötig wenn man es stattdessen so macht:
@echo off
set "ordner=C:\Ordner"
for /f "delims=" %%a in ('dir /b /O-D /A-D "%ordner%"') do set "oldest=%%a"
set "newname=%oldest:~-14%"
ren "%ordner%\%oldest%" "%newname%"
rem do something
del "%ordner%\%newname%"
Halllo pentadd,
hier eine kommentierte Version.
Wichtig ist, dass Du nur den Dateinamen kürzt und nicht die Extension dabei wegkürzt.
Ein paar andere Dinge habe ich auch noch korrigiert.
(Siehe Kommentare und echos)
Falls Du Fragen hast, nur zu...
Gruß Frank
hier eine kommentierte Version.
Wichtig ist, dass Du nur den Dateinamen kürzt und nicht die Extension dabei wegkürzt.
Ein paar andere Dinge habe ich auch noch korrigiert.
(Siehe Kommentare und echos)
@echo off
REM Hier keine Anführungszeichen verwenden
set Ordner=C:\Users\xxx\Desktop\test\
for /f %%a in ('dir "%Ordner%" /a-d /o-d /b') do (
REM kompletten Namen der ältesten Datei merken
set oldest=%%a
REM Namen der ältesten Datei merken
set oldestName=%%~na
REM Extension der ältesten Datei merken
set oldestExtension=%%~xa
)
echo %oldest% //kompletter Name der ältesten Datei
echo %oldestName% //Name ohne Extension der ältesten Datei
echo %oldestExtension% // .Extension der ältesten Datei
set newName=%oldestName:~0,-14%
echo %newName% // gekürzter Name der ältesten Datei
set newName=%newName%%newExtension%
echo %newName% // gekürzter Name mit Extension der ältesten Datei
REM Hier Anführungszeichen verwenden
echo ren "%Ordner%%oldest%" "%Ordner%%newName%"
echo "Mache etwas mit %newName%"
echo ....
echo del "%Ordner%%newName%"
Falls Du Fragen hast, nur zu...
Gruß Frank
Hallo pentadd,
ansich funktioniert Dein jetztiges Skript...
...wenn ich mir ein Verzeichnis anlege
und dort drei Dateien ablege
Kann es sein, dass die Dateinamen Leerzeichen enthalten?
Falls ja oder ohnehin solltest Du die Zeile 5 ergänzen:
Zum Debuggen kannst Du auch die Zeilen 9, 11 und 13 nacheinander mit einem führenden
Gruß Frank
ansich funktioniert Dein jetztiges Skript...
...wenn ich mir ein Verzeichnis anlege
C:\Users\xxx\Desktop\test\
und dort drei Dateien ablege
ABC.ABC123.ABC.ID3_20170101_1202ABC.ABC123.ABC.ID1_20170101_1200ABC.ABC123.ABC.ID2_20170101_1201
Kann es sein, dass die Dateinamen Leerzeichen enthalten?
Falls ja oder ohnehin solltest Du die Zeile 5 ergänzen:
for /f "tokens=*" %%a in ('dir "%Ordner%" /a-d /o-d /b') do (
tokens=*
sorgt dafür, dass die Ergebnisse nicht bei jedem Leerzeichen in zwei oder mehr Teile zelegt werden und dann nicht nur der erste Teil in %%a
gespeichert wird.Zum Debuggen kannst Du auch die Zeilen 9, 11 und 13 nacheinander mit einem führenden
echo
versehen, dann siehst Du was passieren würde und woran es wohl scheitern würde.Gruß Frank
Hallo pentadd,
Du hast also die ursprüngliche Aufgabenstellung geändert?
Es geht nicht mehr nur um die älteste Datei, sondern und alle Dateien?
Wenn Du die Funktionalität deswegen auch in die For-Schleife legst, dann lies mal was Specht Dir schrieb, Thema "Delayed Expansion".
Innerhalb von Forschleifen verhalten sich Variablen anders (als Du erwartest).
Gruß Frank
Du hast also die ursprüngliche Aufgabenstellung geändert?
Es geht nicht mehr nur um die älteste Datei, sondern und alle Dateien?
Wenn Du die Funktionalität deswegen auch in die For-Schleife legst, dann lies mal was Specht Dir schrieb, Thema "Delayed Expansion".
Innerhalb von Forschleifen verhalten sich Variablen anders (als Du erwartest).
Gruß Frank
Hallo pentadd,
...dann lass Dir mal in allen Einzelschritten die Variablen ausgeben und gerne mit einem festen Zeichen davor und dahinter, damit auch Leerzeichen "sichtbar" werden.
Du hast auch wieder Anführungszeichen bei
verwendet, wovon ich Dir aus gutem Grund abgeraten hatte.
Gruß Frank
...dann lass Dir mal in allen Einzelschritten die Variablen ausgeben und gerne mit einem festen Zeichen davor und dahinter, damit auch Leerzeichen "sichtbar" werden.
echo -%%a-echo -!oldest!-usw.
Du hast auch wieder Anführungszeichen bei
set Ordner="C:\Users\xxx\Desktop\test\"
verwendet, wovon ich Dir aus gutem Grund abgeraten hatte.
Gruß Frank
Moin pentadd,
nur einen Klick entfernt wäre auch ein CMD-Fenster.
Da könntest du die Syntax des Befehla "REN" ( Oder "Umbennen", wie es hier im Form genannt wird) nachschlagen.
Grüße
Biber
nur einen Klick entfernt wäre auch ein CMD-Fenster.
Da könntest du die Syntax des Befehla "REN" ( Oder "Umbennen", wie es hier im Form genannt wird) nachschlagen.
C:\Users\Biber>ren /?
Benennt Datei(en) um.
RENAME [Laufwerk:][Pfad]Dateiname1 Dateiname2
REN [Laufwerk:][Pfad]Dateiname1 Dateiname2
Sie können kein neues Laufwerk und keinen anderen Pfad für die Zieldatei
angeben.
Grüße
Biber