68023
Goto Top

Batch Aktualisierung von Dateinamen

Hallo,

ich bedanke mich vorab für Tips zu folgendem Problem:

In einem Verzeichnis befinden sich Dateien wie [bezeichnung]_[jahr]_[monat].[dateiendung]

Meine Aufgabe ist es, die beiden Datumsangaben Jahr und Monat aktuell zu halten.

Ich bin leider nicht so trittsicher in Batch-Dateien. Alles was ich zu Stande bekommen habe ist,
dass nach einem festen Dateinamen gesucht wird und dieser um das Datum ergänzt wird:

@echo off
set Jahr=%date:~-4% 
set Monat=%date:~-7,2% 
ren data.xls "data_%Jahr%_%Monat.xls"  
pause

Wie könnte ich
1) zunächst alle Dateinamen IN EINEM VERZEICHNIS nach "2008" durchsuchen
2) bei diesen Dateien den aktuellen Monat nicht anhängen sondern aktualisieren

Vielen lieben Dank
Nico

Content-Key: 93317

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

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: bastla
bastla 31.07.2008 um 14:53:32 Uhr
Goto Top
Hallo prinzipal87 und willkommen im Forum!

Wie sehr kann man/frau sich darauf verlassen, dass alle Dateinamen aus den genannten Teilen, getrennt durch "_", bestehen? Wenn das gesichert wäre, müsste eigentlich
@echo off & setlocal
set "Muster=*_2008_*.*"  
set "Verz=D:\EIN VERZEICHNIS"  

set Jahr=%date:~-4%
set Monat=%date:~-7,2%

for %%i in ("%Verz%\%Muster%") do for /f "delims=_" %%a in ("%%~ni") do ren "%%i" "%%a_%Jahr%_%Monat%%%~xi"  
genügen.

Grüße
bastla
Mitglied: 68023
68023 31.07.2008 um 15:35:02 Uhr
Goto Top
Hallo bastla,

herzlichen Dank für die Willkommensgrüße und deine Hilfe.

Ich versuche deine Code genau nachzuvollziehen, steige aber nicht hinter die 2. FOR-Schleife sowie die REN-Zeile. Ob du dazu kurz ein Sätzchen schreiben würdest?

Problem jetzt:
Das Skript aktuallisiert das Datum nicht, Dateinamen bleiben unverändert... Was mache ich falsch?

@echo off & setlocal
cls

echo Alle Berichte werden mit dem aktuellen Monat versehen!
echo Sollen wirklich alle Dateinamen bearbeitet werden?

set choice=
set /p choice=j/n 

if "%choice%" == "j" goto rename  
if "%choice%" == "n" goto END  

:rename
echo Dateinamen werden aktualisiert...
set "Muster"=*_2008_*.*"  
set "Verzeichnis"=T:\Neuer Ordner"  

set Jahr=%date:~-4% 
set Monat=%date:~-7,2% 

for %%i in ("%Verzeichnis%\%Muster%") do   
for /f "delims=_" %%a in ("%%~ni") do  
ren "%%i" "%%a_%Jahr%_%Monat%%%~xi"  
echo %i% Dateien geändert 


:END
echo Zum Beenden beliebige Taste!
pause > NUL

Wenn ich nun n Eingebe und bestätige springt er brav zu :END.
Gebe ich j ein, passiert nichts und die Konsole schließt sich...
Was ist falsch hier?

Als kleines Addon hätte ich gerne eine Ausgabe die mir die Anzahl der geänderten Daten anzeigt. So wie ich es mir gedacht habe scheint es nicht zu funktionieren, gell?

Vielen vielen Dank!
Nico
Mitglied: bastla
bastla 31.07.2008 um 16:00:54 Uhr
Goto Top
Hallo prinzipal87!

Ich versuche deine Code genau nachzuvollziehen
Der Versuch hat leider schon bei Deiner Zeile 15 geendet, wo, so wie auch in Zeile 16, ein überzähliges Anführungszeichen unmittelbar vor dem "=" steht.

Die Zeilen 21 bis 23 dürfen nicht aufgeteilt werden, sondern müssen (wie in meiner Zeile 8) nur durch Leerzeichen getrennt in der selben Zeile stehen.

Für Dein Add-On fehlt noch der eigentliche Zähler.

Noch eine Anmerkung zur Sicherheitsabfrage: Nur wenn "n" (klein geschrieben, nur ein Zeichen) eingegeben wird, erfolgt tatsächlich der Sprung zu ":END" - sicherer wäre etwa:
set /p choice=j/n
if /i "%choice%" neq "j" goto :END  
Damit würde die Bearbeitung nur bei Eingabe von "j" oder (wegen "/i") "J" erfolgen.
... steige aber nicht hinter die 2. FOR-Schleife sowie die REN-Zeile.
Mit der zweiten "for"-Schleife wird der Dateiname lt erster Schleife (%%~ni) - siehe dazu am Ende von "for /?" - anhand des Trennzeichens "_" einzelne Teile ("tokens") zerlegt. Da nur der erste Teil interessiert, kann die Angabe von "tokens=1" unterbleiben. Dieser erste Teil steht dann in %%a und wird im "ren"-Befehl verwendet.

Beim Umbenennen muss zunächst die Datei (samt Pfad) angegeben werden - %%i - und danach nur der neue Name + Typ. Dieser neue Namen setzt sich zusammen aus: erster Teil des alten Namens (bis zum ersten "_") - %%a - den Trennzeichen "_" und Jahr und Monat. Da der Dateityp gleich bleiben soll, wird dieser mit "%%~xi" dem Dateipfad in %%i entnommen (inkl "." vor dem Typ).

[Edit] Zusammen mit der Ermittlung der Anzahl wäre der relevante Teil (ab Zeile 21) dann:
set /a Anzahl=0
for %%i in ("%Verzeichnis%\%Muster%") do for /f "delims=_" %%a in ("%%~ni") do ren "%%i" "%%a_%Jahr%_%Monat%%%~xi" && set /a Anzahl+=1  
echo %Anzahl% Dateien geändert 
[/Edit]

Grüße
bastla
Mitglied: 68023
68023 31.07.2008 um 16:25:48 Uhr
Goto Top
Hallo,

gutert Hinweis mit zu der Abfrage, danke schön.

Letzter Durchgang, sorry:

@echo off & setlocal
cls

echo Alle Berichte werden mit dem aktuellen Monat versehen!
echo Sollen wirklich alle Dateinamen bearbeitet werden?

set choice=
set /p choice=j/n 
if /i "%choice%" neq "j" goto :END  

:rename
echo Dateinamen werden aktualisiert...
set "Muster=*_2008_*.xls"  
set "Verzeichnis=T:\DCAA-TV intern\Krüger\Makowski\Neuer Ordner"  

set Jahr=%date:~-4% 
set Monat=%date:~-7,2% 

for %%i in ("%Verzeichnis%\%Muster%") do for /f "delims=_" %%a in ("%%~ni") do ren "%%i" "%%a_%Jahr%_%Monat%%%~xi"   

:END
echo Zum Beenden beliebige Taste!
pause > NUL

Script läuft fehlerfrei durch, aber die Dateinamen ändern sich nicht... Wieder ein Tipfehler?

Nico
Mitglied: bastla
bastla 31.07.2008 um 16:46:53 Uhr
Goto Top
Hallo prinzipal87!

Wieder ein Tipfehler?
Eher ein Umlaute-Problem (durch "Krüger" im Pfad) - wenn Du an den Anfang des Batches ein "chcp 1252" setzt, wird auch in CMD ANSI anstatt ASCII verwendet.

Grüße
bastla
Mitglied: 68023
68023 01.08.2008 um 14:11:00 Uhr
Goto Top
Hallo bastla,

genial!
Danke schön!!!

Nico