chainsaw
Goto Top

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

Content-ID: 108137

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

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

bastla
bastla 05.02.2009 um 11:41:01 Uhr
Goto Top
Hallo chainsaw und willkommen im Forum!
Hallo Profis,
Falls Du auch mit mir vorlieb nimmst face-wink, 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
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
chainsaw
chainsaw 05.02.2009 um 12:29:26 Uhr
Goto Top
Hallo bastla

Falls Du auch mit mir vorlieb nimmst

Ich würde sagen das das ganz klar Profimäßig ist was du da gepostet hast! Und so schnell - unglaublich. face-smile

Ich versteh ja nicht wirklich was da alles drinsteht, aber eine Frage habe ich noch:

Die Geschichte mit "%Alt:~21,2" usw. beschreibt das die Anzahl der Zeichen von links oder so?
Damit kann ich garnichts anfangen.
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?

Trotzdem sehr herzlichen Dank für deine schnelle Hilfe!

Gruß Andi
bastla
bastla 05.02.2009 um 12:46:06 Uhr
Goto Top
Hallo chainsaw!

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 Beispiel
1GZTEST200902100010004402nnW00.dat
               ^    ^
1234567890123456789012345678901234
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
chainsaw
chainsaw 05.02.2009 um 12:49:05 Uhr
Goto Top
Hallo nochmal ich,

also das mit der Stelle hab ich nach dem Try & Error-Verfahren hinbekommen. face-smile

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?

Danke und Gruß ANdi
bastla
bastla 05.02.2009 um 12:58:51 Uhr
Goto Top
Hallo chainsaw!
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 17
>>D:\RenLog.txt echo ren %1 "%T1%.%T2%.%T3%.%T4%.%T5%.%T6%.%T7%%~x1"
ein Protokoll der Simulation erstellen und die neu entstehenden Dateinamen vergleichen bzw als (ungetesteter) Ersatz der Zeile 17 mit
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!
)
anzeigen lassen, bei welchen Dateien es eine Namengleichheit geben würde.

Grüße
bastla
chainsaw
chainsaw 05.02.2009 um 13:21:53 Uhr
Goto Top
Hallo bastla,

Jetzt bin ich völlig verwirrt und überfordert. Die Dateinamen sind eigentlich nicht gleich, denn Namen mit gleichem Datum und gleicher Seitenzahl unterscheiden sich ja durch den Buchstaben. Somit gibt`s eigentlch keine gleichen Dateinamen.


Nach dem rename Befehl habe ich jetzt folgendes eingefügt:

ren %1 "%zvar%.%avar%.%dvar%.%T4%.44.05.%T7%%~x1"
move D:\Daten\*_*.dat D:\Daten\out

if exist "%Dateien%" dir /b /A:-d "%Dateien%">nul 2>nul && goto :ProcessFile

Ich kann die Daten vorneweg auch GZ_ benennen und frage dann das Underline ab um wegzumoven.

if exist "%Dateien%" dir /b /A:-d "%Dateien%">nul 2>nul && goto :ProcessFile

Das stammt übrignes auch von dir hier aus dem Forum face-smile
und jetzt gehts. Ich bin glücklich und bedanke mich für deine Geduld und deine Hilfe! Echt Profimäßig!

Danke und Gruß
Andi
bastla
bastla 05.02.2009 um 15:43:51 Uhr
Goto Top
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:
set "Dateien=D:\Daten" 
...
for /f "delims=" %%i in ('dir /b "%Dateien%\*.dat"') do call :ProcessFile "%Dateien%\%%i"
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) ... face-sad

Grüße
bastla
chainsaw
chainsaw 06.02.2009 um 15:33:57 Uhr
Goto Top
Hallo bastla,

Perfekt! So klappt`s noch besser. Vielen Dank!