String aus Dateinamen abfragen und ändern per Batch
Hallo Profis,
Ich hab hier ein Problem und komme mit meinen kleinen Batch-Kenntnissen nicht weiter.
Folgende Situation: Ich habe in einem Verzeichnis zig Dateien die so aussehen:
1GZTEST200902100010004402nnW00.dat
Diese möchte ich jetzt per Batch renamen. Bestimmte Teile des
Dateinamens sollen ersetzt werden, einige sollen so bleiben,
einige dürfen ganz verschwinden.
Eine fertige Datei sollte z.B. so aussehen:
GZ.TEST.20090210.001000.44.02.W.dat
Die ersten drei Namensteile kann ich mit set /p var ja ganz gut
abfragen und umbenennen (also GZ, TEST und das Datum.
Aber dann beginnen meine Schwierigkeiten: Den Abschnitt 001000
und der Buchstabe W sind immer verschieden und können z.B. bis 099000 gehen
und der Buchstabe W kann irgendeiner aus dem Alphabet sein.
Wie mache ich das nun, dass ich diese beiden Angaben im Dateiname
unverändert bleiben und im umbenannten File wieder so eingesetzt werden?
Wäre toll wenn ihr mit weiterhelfen könnet - das würde mir wahnsinnig
viel Arbeit sparen, denn eine externe Software darf ich nicht verwenden,
bzw. installieren.
Danke und Gruß
Andi
Ich hab hier ein Problem und komme mit meinen kleinen Batch-Kenntnissen nicht weiter.
Folgende Situation: Ich habe in einem Verzeichnis zig Dateien die so aussehen:
1GZTEST200902100010004402nnW00.dat
Diese möchte ich jetzt per Batch renamen. Bestimmte Teile des
Dateinamens sollen ersetzt werden, einige sollen so bleiben,
einige dürfen ganz verschwinden.
Eine fertige Datei sollte z.B. so aussehen:
GZ.TEST.20090210.001000.44.02.W.dat
Die ersten drei Namensteile kann ich mit set /p var ja ganz gut
abfragen und umbenennen (also GZ, TEST und das Datum.
Aber dann beginnen meine Schwierigkeiten: Den Abschnitt 001000
und der Buchstabe W sind immer verschieden und können z.B. bis 099000 gehen
und der Buchstabe W kann irgendeiner aus dem Alphabet sein.
Wie mache ich das nun, dass ich diese beiden Angaben im Dateiname
unverändert bleiben und im umbenannten File wieder so eingesetzt werden?
Wäre toll wenn ihr mit weiterhelfen könnet - das würde mir wahnsinnig
viel Arbeit sparen, denn eine externe Software darf ich nicht verwenden,
bzw. installieren.
Danke und Gruß
Andi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 108137
Url: https://administrator.de/contentid/108137
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo chainsaw und willkommen im Forum!
Das "echo" vor dem "ren" soll ein gefahrloses Testen erlauben, da so der Umbenennungsbefehl jeweils nur angezeigt wird. Die Variablen %T1% und %T2% können dann natürlich wieder per "set /p" befüllt werden, und das Suchmuster "D:\Daten\*.dat" kann vielleicht auch noch etwas eingeschränkt werden (außer, es sollen ohnehin alle .dat-Dateien des Verzeichnisses bearbeitet werden).
Grüße
bastla
Hallo Profis,
Falls Du auch mit mir vorlieb nimmst , hätte ich etwa folgenden Ansatz zu bieten:@echo off & setlocal
set "Dateien=D:\Daten\*.dat"
set "T1=GZ"
set "T2=TEST"
set "T3=%date:~-4%%date:~-7,2%%date:~-10,2%"
for /f "delims=" %%i in ("%Dateien%") do call :ProcessFile "%%i"
goto :eof
:ProcessFile
set "Alt=%~n1"
set "T4=%Alt:~15,6%"
set "T5=%Alt:~21,2%"
set "T6=%Alt:~23,2%"
set "T7=%Alt:~27,1%"
echo ren %1 "%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1"
goto :eof
Grüße
bastla
Hallo chainsaw!
war das Ergebnis zwar eigentlich wunschgemäß (nach den ersten 15 Zeichen sind die nächsten 6 Zeichen "001000"), aber Du kannst die Zuweisung zu %T4% ja in Zeile 12 entsprechend anpassen ...
Grüße
bastla
Die Geschichte mit "%Alt:~21,2" usw. beschreibt das die Anzahl der Zeichen von links oder so?
Der erste Wert gibt an, wie viele Zeichen (von links) übersprungen werden sollen, der zweite Wert, wie viele danach verwendet werden sollen - für die (nicht benötigte) 1 am Anfang des Dateinamens müsstest Du daher zB die Werte 0 (keine Stellen überspringen) und 1(eine Stelle verwenden) angeben.Die Stelle nach dem Datum hat z.B. eine "0" zuviel, und heißt 000100 statt 001000 muß ich da an den Werten spielen bis es passt, oder wo veränder ich da was?
Bei meinem Test mit Deinem geposteten Beispiel1GZTEST200902100010004402nnW00.dat
^ ^
1234567890123456789012345678901234
Grüße
bastla
Hallo chainsaw!
ein Protokoll der Simulation erstellen und die neu entstehenden Dateinamen vergleichen bzw als (ungetesteter) Ersatz der Zeile 17 mit
anzeigen lassen, bei welchen Dateien es eine Namengleichheit geben würde.
Grüße
bastla
Aber der batch benennt immer nur eine Datei um und bringt dann den Fehler "Datei existiert bereits oder Datei konnte nicht gefunden werden".
Wäre ein Lösungsansatz, die renamte Datei in ein Out-Verzeichnis zu schieben?
Soferne durch das Weglassen von Informationen gleiche Dateinamen entstehen, würde das auch nicht helfen - daher vielleicht einmal mit folgender alternativen Zeile 17Wäre ein Lösungsansatz, die renamte Datei in ein Out-Verzeichnis zu schieben?
>>D:\RenLog.txt echo ren %1 "%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1"
if not exist "%~dp1\%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1" (
ren %1 "%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1"
) else (
echo %1 -- ^>"%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1" existiert bereits!
)
Grüße
bastla
Hallo chainsaw!
Sorry - in meinem nun wirklich nicht profimäßigen Ansatz ganz oben (war leider etwas abgelenkt) hätten die Zeile 2 und 7 richtig so aussehen sollen:
Damit sollte dann auch ohne weitere Verrenkungen der Rest des Batches funktionieren ...
Den Hinweis "ungetestet" hatte ich übrigens nicht dabei, weil ich es ja mit einer Datei versucht hatte (mir ging es vorrangig um die Zerlegung des Namens) ...
Grüße
bastla
Sorry - in meinem nun wirklich nicht profimäßigen Ansatz ganz oben (war leider etwas abgelenkt) hätten die Zeile 2 und 7 richtig so aussehen sollen:
set "Dateien=D:\Daten"
...
for /f "delims=" %%i in ('dir /b "%Dateien%\*.dat"') do call :ProcessFile "%Dateien%\%%i"
Den Hinweis "ungetestet" hatte ich übrigens nicht dabei, weil ich es ja mit einer Datei versucht hatte (mir ging es vorrangig um die Zerlegung des Namens) ...
Grüße
bastla