Dateien mit BATCH umbenennen
Hoffe könnte mir helfen! Will ein Script schreiben, was eine Reihe von Dateien umbenennt.
Die Dateien heißen:
ABC001.txt
ABC002.txt
...
Mein Ansatz ist wie folgt :
for %i in (ABC???.txt) do ren %i DEF???.txt
bekomme aber dann diese Meldung:
i was unexpected at this time.
Als Zusatzinformation
Ich nutze Windows XP SP3
Hoffe könnte mir helfen.
Vielen Dank
Die Dateien heißen:
ABC001.txt
ABC002.txt
...
Mein Ansatz ist wie folgt :
for %i in (ABC???.txt) do ren %i DEF???.txt
bekomme aber dann diese Meldung:
i was unexpected at this time.
Als Zusatzinformation
Ich nutze Windows XP SP3
Hoffe könnte mir helfen.
Vielen Dank
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 99199
Url: https://administrator.de/forum/dateien-mit-batch-umbenennen-99199.html
Ausgedruckt am: 11.04.2025 um 20:04 Uhr
5 Kommentare
Neuester Kommentar
Hallo rique1me!
Wenn Du bereits an weitere Aufgaben denkst (und Du zu diesen hier Batches posten wirst), solltest Du einen Blick auf diese werfen (ich verwende übrigens unten type="plain" für die Darstellung ohne Zeilennummern) ...
Sogar das könnte entfallen, da die "for"-Schleife für nicht vorhandene Dateien einfach nullmal ausgeführt wird (allerdings gäbe es dann keine Rückmeldung) ...
Grüße
bastla
Wenn Du bereits an weitere Aufgaben denkst (und Du zu diesen hier Batches posten wirst), solltest Du einen Blick auf diese werfen (ich verwende übrigens unten type="plain" für die Darstellung ohne Zeilennummern) ...
Wenn es den Präfix gibt, soll die Datei umbenannt werden ansonsten die Fehlermeldung "Datei nicht gefunden" ausgegeben werden.
Da genügt eindir /a-d "%prae%???.txt" >nul 2>nul || goto :NichtGefunden
...
...
...
goto :eof
:NichtGefunden
echo Keine passende Datei gefunden!
...
Grüße
bastla
Hallo rique1me!
In diesem Fall brauchst Du tatsächlich eine Schleife:
Mit dem Startwert "1000" und dem "-3" (= letzte 3 Stellen) legst Du die Stellenanzahl des Zählers fest und sorgst für die führenden Nullen (beim ersten Durchlauf wird die Nr "1001" erzeugt, die letzten 3 Stellen sind "001", usw).
Die Schleife dient dazu, die nächste freie Nummer zu finden, indem jeweils auf Existenz einer Datei mit der aktuellen Nummer geprüft wird.
Der Nachteil dieser Version liegt darin, dass für jede Datei bei der Nummer "001" zu prüfen begonnen wird. Wenn daher viele Dateien in diesem Batch verarbeitet werden sollen, wäre die Alternative, zunächst die erste freie Nummer zu bestimmen und diese dann einfach für jede Datei hochzuzählen. Das ginge etwa so:
Die Verwendung von "delayedExpansion" erspart hier die Verwendung eines Unterprogrammes, da damit in der "for"-Schleife die Nummer %Nr% nicht nur hochgezählt, sondern deren neuer Wert auch sofort verwendet werden kann (siehe Schreibweise !Nr! anstatt %Nr%).
Um übrigens den Ablauf (für beide beschriebene Varianten) ganz exakt zu beschreiben: Es wird die niedrigste freie Nummer gesucht - falls es etwa "Text012.txt" nicht gibt, "Text013.txt" allerdings vorhanden ist, geht das Ganze für die Version 2 schief (in Version 1 werden die Lücken aufgefüllt).
Abhilfe kann hier die Suche nach der höchsten tatsächlich vorhandenen Nummer schaffen:
Grüße
bastla
In diesem Fall brauchst Du tatsächlich eine Schleife:
@echo off & setlocal
set "Alt=Test???"
set "Neu=Text"
set "Ext=.txt"
set /a Nr=1000
pushd "D:\Dein Ordner mit den Dateien"
for /f "delims=" %%i in ('dir /b /a-d /on "%Alt%*%Ext%" 2^>nul') do call :ProcessFile "%%i"
popd
goto :eof
:ProcessFile
:Schleife
set /a Nr+=1
if exist "%Neu%%Nr:~-3%%Ext%" goto :Schleife
ren %1 "%Neu%%Nr:~-3%%Ext%"
goto :eof
Die Schleife dient dazu, die nächste freie Nummer zu finden, indem jeweils auf Existenz einer Datei mit der aktuellen Nummer geprüft wird.
Der Nachteil dieser Version liegt darin, dass für jede Datei bei der Nummer "001" zu prüfen begonnen wird. Wenn daher viele Dateien in diesem Batch verarbeitet werden sollen, wäre die Alternative, zunächst die erste freie Nummer zu bestimmen und diese dann einfach für jede Datei hochzuzählen. Das ginge etwa so:
@echo off & setlocal enabledelayedexpansion
set "Alt=Test???"
set "Neu=Text"
set "Ext=.txt"
set /a Nr=1000
pushd "D:\Dein Ordner mit den Dateien"
:Schleife
set /a Nr+=1
if exist "%Neu%%Nr:~-3%%Ext%" goto :Schleife
for /f "delims=" %%i in ('dir /b /a-d /on "%Alt%*%Ext%" 2^>nul') do (
ren %%i "%Neu%!Nr:~-3!%Ext%"
set /a Nr+=1
)
popd
Um übrigens den Ablauf (für beide beschriebene Varianten) ganz exakt zu beschreiben: Es wird die niedrigste freie Nummer gesucht - falls es etwa "Text012.txt" nicht gibt, "Text013.txt" allerdings vorhanden ist, geht das Ganze für die Version 2 schief (in Version 1 werden die Lücken aufgefüllt).
Abhilfe kann hier die Suche nach der höchsten tatsächlich vorhandenen Nummer schaffen:
@echo off & setlocal enabledelayedexpansion
set "Alt=Test???"
set "Neu=Text"
set "Ext=.txt"
pushd "D:\Dein Ordner mit den Dateien"
set Hoechste=
for /f "delims=" %%i in ('dir /b /a-d /on "%Neu%*%Ext%" 2^>nul') do set "Hoechste=%%~ni"
set /a Nr=1000
if defined Hoechste set /a Nr=1%Hoechste:~-3%
set /a Nr+=1
for /f "delims=" %%i in ('dir /b /a-d /on "%Alt%*%Ext%" 2^>nul') do (
ren %%i "%Neu%!Nr:~-3!%Ext%"
set /a Nr+=1
)
popd
bastla