rique1me
Goto Top

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

Content-Key: 99199

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

Ausgedruckt am: 28.03.2024 um 10:03 Uhr

Mitglied: bastla
bastla 14.10.2008 um 10:31:31 Uhr
Goto Top
Hallo rique1me!

Wenn Du Deinen Ansatz in einem Batch verwenden willst, musst Du jeweils die "%"-Zeichen verdoppeln, also:
for %%i in (ABC???.txt) do ren %%i DEF???.txt
Allerdings würde auch
ren ABC???.txt DEF???.txt
genügen.

Grüße
bastla
Mitglied: rique1me
rique1me 14.10.2008 um 11:06:29 Uhr
Goto Top
hey bastla danke =)
das ist ja nur als übung für weiter aufgaben
das problem habe ich gelöst:

Nun habe ich ein neues.
Ich will, dass der User gefragt wird, welchen Präfix die Dateien haben.
Wenn es den Präfix gibt, soll die Datei umbenannt werden ansonsten die Fehlermeldung
"Datei nicht gefunden" ausgegeben werden.

Ich hänge gerade beim FIND

Hier mein Code

@echo off
set prae=
set /p prae=Geben Sie den Praefix der Datei(en) ein!

find /i "%prae%"

if %errorlevel%==0 (

for %%i in (%prae%???.txt) do ren %%i DEF???.txt

) else (

echo Datei nicht gefunden!

)
Mitglied: bastla
bastla 14.10.2008 um 11:33:10 Uhr
Goto Top
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) ...
Wenn es den Präfix gibt, soll die Datei umbenannt werden ansonsten die Fehlermeldung "Datei nicht gefunden" ausgegeben werden.
Da genügt ein
dir /a-d "%prae%???.txt" >nul 2>nul || goto :NichtGefunden
...
...
...
goto :eof

:NichtGefunden
echo Keine passende Datei gefunden!
...
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
Mitglied: rique1me
rique1me 14.10.2008 um 13:41:39 Uhr
Goto Top
kannst du mir vielleicht verraten, wie man den dateinamen noch automatisch hochzählen lassen kann?

Also wenn ich sage die dateien heißen alle

Test001.txt
Test002.txt
Test003.txt
...

und das Programm soll die dann in
Text001.txt
Text002.txt
Text003.txt
...

speichern. also immer automatisch fortsetzen.
auch wenn ich jetzt andere dateien in text speichern will soll der keine überschreiben sondern an der zählweise anschließen
Mitglied: bastla
bastla 14.10.2008 um 23:24:15 Uhr
Goto Top
Hallo rique1me!

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
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:
@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
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:
@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
Grüße
bastla