pentadd
Goto Top

Batch-Skript Schleife älteste Datei umbenennen

Hallo zusammen,

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!

Content-Key: 353595

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

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

Mitglied: 134464
134464 Nov 03, 2017 updated at 11:28:49 (UTC)
Goto Top
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 face-wink!
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%"  
Member: Pedant
Pedant Nov 03, 2017 at 12:00:59 (UTC)
Goto Top
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)

@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
Member: pentadd
pentadd Nov 03, 2017 at 12:16:49 (UTC)
Goto Top
Hallo Frank,
Vielen Dank für deine Hilfe! Die Extension braucht nicht beachtet zu werden, da die Dateien keine besitzen.
Der Name ist nach dem Schema "ABC.ABC123.ABC.ID1_20170101_1200" aufgebaut. Die Länge vor dem Zeitstempel ist variabel, daher die 14 Stellen.

Ich habe das Skript also entsprechend umgebaut...
@echo off

set Ordner=C:\Users\xxx\Desktop\test\

for /f %%a in ('dir "%Ordner%" /a-d /o-d /b') do (  
	set oldest=%%a
)

set newName=%oldest:~0,-14%
echo %newName% // gekürzter Name der ältesten Datei
ren "%Ordner%%oldest%" "%Ordner%%newName%"  
echo "Mache etwas mit %newName%"  
echo ....
del "%Ordner%%newName%"  

... erhalte aber viele Zeilen mit "The filename, directory name, or volume label syntax is incorrect."
Member: Pedant
Pedant Nov 03, 2017 at 13:38:14 (UTC)
Goto Top
Hallo pentadd,

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
Member: pentadd
pentadd Nov 06, 2017 at 07:47:22 (UTC)
Goto Top
Hallo Frank,

Ich habe das Skript noch mal so umgebaut, dass es die Aktionen für jede Datei des Alters nach sortiert ausführt.
set Ordner="C:\Users\xxx\Desktop\test\"  

for /f "tokens=*" %%a in ('dir "%Ordner%" /a-d /o-d /b') do (  
        echo %%a
	set oldest=%%a 
	set newName=%oldest:~0,-14%
	echo %newName%
	echo ren "%Ordner%%oldest%" "%Ordner%%newName%"  
	echo "Mache etwas mit %newName%"  
	echo ....
	echo del "%Ordner%%newName%"  
)

Als Ergebnis kommt jedoch

C:\Users\xxx\Desktop>ABC_import.bat
ABC.ABCD12.ABC.WE_20171001_0428
~0,-14
ren ""C:\Users\xxx\Desktop\test\"ABC.ABCD12.ABC.ID6_20171001_0433 " ""C:\Users\xxx\Desktop\test\"~0,-14"  
"Mache etwas mit ~0,-14"  
....
del ""C:\Users\xxx\Desktop\test\"~0,-14"  
ABC.ABCD12.ABC.TL_20171001_0010
~0,-14
ren ""C:\Users\xxx\Desktop\test\"ABC.ABCD12.ABC.ID6_20171001_0433 " ""C:\Users\xxx\Desktop\test\"~0,-14"  
"Mache etwas mit ~0,-14"  
....
del ""C:\Users\xxx\Desktop\test\"~0,-14"  
usw...

Vielen Dank dir!
Member: Pedant
Pedant Nov 06, 2017 at 08:18:34 (UTC)
Goto Top
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
Member: pentadd
pentadd Nov 06, 2017 at 08:36:49 (UTC)
Goto Top
Stimmt. Überlesen.

Demzufolge habe ich es so angepasst:
for /f "tokens=*" %%a in ('dir "%Ordner%" /a-d /o-d /b') do (  
        echo %%a
	set oldest=%%a 
	set newName=!oldest:~0,-15!
	echo !newName!
	echo ren "%Ordner%!oldest!" "%Ordner%!newName!"  
	echo "Mache etwas mit !newName!"  
	echo ....
	echo del "%Ordner%!newName!"  
)
(echo als DEBUG)

Beim Umbennen versucht er jedoch
ren ""C:\Users\xxx\Desktop\test\"ABC.ABCD12.ABC.ID6_20171001_0433 " ""C:\Users\xxx\Desktop\test\"ABC.ABCD12.ABC.ID6"  
also mit zu vielen Anführungszeichen und Leerzeichen hinter dem alten Dateinamen.
Member: Pedant
Pedant Nov 06, 2017 at 10:01:23 (UTC)
Goto Top
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.
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
Member: Biber
Biber Nov 06, 2017 at 10:14:33 (UTC)
Goto Top
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.

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