Datei automatisch umbenennen mit Datum und/oder Zähler durch Batchaufruf
Datei mit festem Namen mehrmals täglich durch Aufruf einer Batch umbenennen und mit Datum & Zähler versehen orginal.txt in orginal030305_1.txt usw.
Hallo zusammen, ich habe folgendes Problem: eine Datei mit festem Namen wird mehrmals täglich neu erstellt. Bevor sie die neue Datei erstellt wird, muss die alte umbenannt werden ohne die schon umbenannten zu überschreiben.
ren C:\orginal.txt orginal030305_1.txt
beim nächsten Aufruf der umbenenner.bat soll die orginal.txt in orginal030305_2.txt, ..._3.txt usw. umgetauft werden.
der Ansatz ist sicher bei alaska schon ganz gut!
Danke
Hallo zusammen, ich habe folgendes Problem: eine Datei mit festem Namen wird mehrmals täglich neu erstellt. Bevor sie die neue Datei erstellt wird, muss die alte umbenannt werden ohne die schon umbenannten zu überschreiben.
ren C:\orginal.txt orginal030305_1.txt
beim nächsten Aufruf der umbenenner.bat soll die orginal.txt in orginal030305_2.txt, ..._3.txt usw. umgetauft werden.
der Ansatz ist sicher bei alaska schon ganz gut!
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7662
Url: https://administrator.de/contentid/7662
Ausgedruckt am: 23.11.2024 um 03:11 Uhr
42 Kommentare
Neuester Kommentar
Wie siehts denn aus, wenn du statt ner laufenden Nummerierung die aktuelle Uhrzeit hinter das Datum anhängst. Das Ganze könnte dann so aussehen:
for /F "tokens=1,2,3,4 delims=. " %%a in ('date /t') do set dateiname=%%d%%c%%b
for /F "tokens=1,2 delims=: " %%a in ('time /t') do set dateiname=%dateiname%_%%a%%b
ren original.txt original%dateiname%.txt
set dateiname=
Solltest du nun dringend eine laufende Nummerierung brauchen, poste noch mal, das geht auch.
Gruß
Meto
for /F "tokens=1,2,3,4 delims=. " %%a in ('date /t') do set dateiname=%%d%%c%%b
for /F "tokens=1,2 delims=: " %%a in ('time /t') do set dateiname=%dateiname%_%%a%%b
ren original.txt original%dateiname%.txt
set dateiname=
Solltest du nun dringend eine laufende Nummerierung brauchen, poste noch mal, das geht auch.
Gruß
Meto
Dein Ansatz ist grundsätzlich richtig. Die Zeile für zum adddieren muss also so aussehen:
SET /A DATZ=%DATZ%+1
Unbedingt beachten, dass keine Leerstellen vor und nach dem "=" vorhaden sind.
Wenn du die Variable jetzt aber so setzt, geschieht das nur temporär. Du müstest jetzt also eine Systemvariable mit dem Wert 1 setzen z. B. in der Autoexec.bat oder über Arbeitsplatz>Eigenschaften>Erweitert>Umgebungsvariablen. Dann funktioniert das auch.
Ein Problem könnte allerdings sein, dass die Variable (erst) bei System auf eins gesetzt wird. Daher müsste evtl. noch eine Überprüfung rein, ob die Datei schon vorhanden ist (bei Neustart am selben Tag), oder ob sich das Datum geändert hat (bei durchlaufendem Rechner).
Gruß
Meto
SET /A DATZ=%DATZ%+1
Unbedingt beachten, dass keine Leerstellen vor und nach dem "=" vorhaden sind.
Wenn du die Variable jetzt aber so setzt, geschieht das nur temporär. Du müstest jetzt also eine Systemvariable mit dem Wert 1 setzen z. B. in der Autoexec.bat oder über Arbeitsplatz>Eigenschaften>Erweitert>Umgebungsvariablen. Dann funktioniert das auch.
Ein Problem könnte allerdings sein, dass die Variable (erst) bei System auf eins gesetzt wird. Daher müsste evtl. noch eine Überprüfung rein, ob die Datei schon vorhanden ist (bei Neustart am selben Tag), oder ob sich das Datum geändert hat (bei durchlaufendem Rechner).
Gruß
Meto
Im Grunde geht es bei der Überprüfung um folgende Probleme:
1. Der Rechner ist ständig an:
Die Variable DATZ wird beim Systemstart auf 1 gesetzt und ab dann beim Aufrufen der Batchdatei hochgezählt. Solange kein Systemstart durchgeführt wird, wiederholt sich dieser Vorgang unendlich. Auch wenn es ein neues Datum gibt.
z. B. datei20050101_155.txt ist die 155. Kopie vom 01.01.05 nach 24 Uhr ändert sich der Dateiname wie folgt datei20050102_156.txt. Es ist aber nicht die 156. Datei vom 02.01.05 sondern die erste.
Hierzu könnte man, wenn notwendig, eine Routine einbauen, die das letzte Datum in eine weitere Variable speichert. Weicht dann die Variable vom aktuellen Datum ab, ist ein neuer Tag und DATZ wird auf 1 gesetzt.
2. Der Rechner wird zwischen durch neu gestartet:
Die Variable DATZ wird erneut auf 1 gesetzt. Das gibt jetzt ein Problem, wenn am 01.01.2005 bereits eine oder mehrere Dateien umbenannt wurden, denn die Datei datei20050101_1.txt gibt es ja schon. Es müsste also gegebenen Falls festgestellt werden, ob die Datei bereits exsistiert und sogar evtl. die letzte Nummer aus den Dateinamen gelesen werden. Es sei denn es ist kein Problem, wenn die Datei überschrieben oder nicht kopiert wird.
Gruß
Meto
1. Der Rechner ist ständig an:
Die Variable DATZ wird beim Systemstart auf 1 gesetzt und ab dann beim Aufrufen der Batchdatei hochgezählt. Solange kein Systemstart durchgeführt wird, wiederholt sich dieser Vorgang unendlich. Auch wenn es ein neues Datum gibt.
z. B. datei20050101_155.txt ist die 155. Kopie vom 01.01.05 nach 24 Uhr ändert sich der Dateiname wie folgt datei20050102_156.txt. Es ist aber nicht die 156. Datei vom 02.01.05 sondern die erste.
Hierzu könnte man, wenn notwendig, eine Routine einbauen, die das letzte Datum in eine weitere Variable speichert. Weicht dann die Variable vom aktuellen Datum ab, ist ein neuer Tag und DATZ wird auf 1 gesetzt.
2. Der Rechner wird zwischen durch neu gestartet:
Die Variable DATZ wird erneut auf 1 gesetzt. Das gibt jetzt ein Problem, wenn am 01.01.2005 bereits eine oder mehrere Dateien umbenannt wurden, denn die Datei datei20050101_1.txt gibt es ja schon. Es müsste also gegebenen Falls festgestellt werden, ob die Datei bereits exsistiert und sogar evtl. die letzte Nummer aus den Dateinamen gelesen werden. Es sei denn es ist kein Problem, wenn die Datei überschrieben oder nicht kopiert wird.
Gruß
Meto
Hier das Script:
echo
cls
set /a DATZ=1
for /F "tokens=1,2,3,4 delims=. " %%a in ('date /t') do set datum=%%d%%c%%b
for /F "tokens=1,2 delims=: " %%a in ('time /t') do set uhrzeit=%%a%%b
dir original_%datum%_*.txt /b 1>_dateiliste.tmp
find "original" _dateiliste.tmp /c >_dateianzahl.tmp
for /f "skip=1 tokens=1,2,3 delims=: " %%a in (_dateianzahl.tmp) do set /a DATZ=%%c
set /a DATZ=%DATZ%+1
if %DATZ% LSS 10 set DATZ=0%DATZ%
ren original.txt original_%datum%_%DATZ%_%uhrzeit%_.txt
del _dateiliste.tmp
del _dateianzahl.tmp
Wichtig ist, dass keine nummerierten Dateien zwischdurch gelöscht werden. Das heist, wenn es einen Satz der Dateien 01, 02, 03, 04, 05 gibt, darfst du am aktuellen Tag nicht z. B. die Datei 03 löschen, weil er dann die Anzahl der Dateien mit vier feststellt und versucht die Datei mit 05 zu bezeichnen. Das geht aber nicht, weil die schon vorhanden ist. Kein Problem gibt es, wenn alle Dateien 03-05 gelöscht werden oder wenn du die anderen umbenennst, so dass es wieder passt.
Wenn du noch Fragen hast einfach posten.
Gruß
Meto
echo
cls
set /a DATZ=1
for /F "tokens=1,2,3,4 delims=. " %%a in ('date /t') do set datum=%%d%%c%%b
for /F "tokens=1,2 delims=: " %%a in ('time /t') do set uhrzeit=%%a%%b
dir original_%datum%_*.txt /b 1>_dateiliste.tmp
find "original" _dateiliste.tmp /c >_dateianzahl.tmp
for /f "skip=1 tokens=1,2,3 delims=: " %%a in (_dateianzahl.tmp) do set /a DATZ=%%c
set /a DATZ=%DATZ%+1
if %DATZ% LSS 10 set DATZ=0%DATZ%
ren original.txt original_%datum%_%DATZ%_%uhrzeit%_.txt
del _dateiliste.tmp
del _dateianzahl.tmp
Wichtig ist, dass keine nummerierten Dateien zwischdurch gelöscht werden. Das heist, wenn es einen Satz der Dateien 01, 02, 03, 04, 05 gibt, darfst du am aktuellen Tag nicht z. B. die Datei 03 löschen, weil er dann die Anzahl der Dateien mit vier feststellt und versucht die Datei mit 05 zu bezeichnen. Das geht aber nicht, weil die schon vorhanden ist. Kein Problem gibt es, wenn alle Dateien 03-05 gelöscht werden oder wenn du die anderen umbenennst, so dass es wieder passt.
Wenn du noch Fragen hast einfach posten.
Gruß
Meto
Habe ich auch schon probiert, aber es führt leider immer noch zu einem Syntaxfehler.
Wenn ich aber folgendes eingebe, dann klappt es: rename backup.txt backupok.txt
Wenn ich aber mit der variablen die Datei umbenennen will gibt es einen Syntaxfehler, aber wenn ich echo %date% mache, dann kann er die Variable umsetzten und es gibt keinen Fehler...
Was mache ich falsch?
Wenn ich aber folgendes eingebe, dann klappt es: rename backup.txt backupok.txt
Wenn ich aber mit der variablen die Datei umbenennen will gibt es einen Syntaxfehler, aber wenn ich echo %date% mache, dann kann er die Variable umsetzten und es gibt keinen Fehler...
Was mache ich falsch?
Hi,
setzt mal die Variable in Anführungszeichen!
Psycho
Klug ist jeder - der eine vorher, der andere hinterher
setzt mal die Variable in Anführungszeichen!
Psycho
Klug ist jeder - der eine vorher, der andere hinterher
@meto
Jepp.
Nein, wenn bei ihm das %date% in der Form "Mi, 24.01.2006" ausgegeben wird.
Denn da ist dieses Leerzeichen drin, welches zum "Syntax-Error" führt.
@Bromer
Die Minimallösung also wie von Psycho Dad gepostet (oder zumindest gemeint):
ren backup.txt "backup_%date%.txt"
> führt zu einer Datei "backup_Mi, 24.01.2006.txt"
Wenn Du das unschön und unübersichtlich findest, zerlege das Datum in JJ, MM und TT.
Siehe zum Beispiel im Batch-Tut-III im Bereich "Batch und Shell" ("Umgang mit Datums- und Zeitvariablen im Batch").
Dort ist auch eine "GetAllDateTimeInfos.bat" dabei, die Dir diese Zerlegerei eines %date%-Werts abnimmt.
HTH Biber
Wenn Anführungszeichen, dann der ganze Dateiname.
Sollte aber auch ohne gehen
Denn da ist dieses Leerzeichen drin, welches zum "Syntax-Error" führt.
@Bromer
Die Minimallösung also wie von Psycho Dad gepostet (oder zumindest gemeint):
ren backup.txt "backup_%date%.txt"
> führt zu einer Datei "backup_Mi, 24.01.2006.txt"
Wenn Du das unschön und unübersichtlich findest, zerlege das Datum in JJ, MM und TT.
Siehe zum Beispiel im Batch-Tut-III im Bereich "Batch und Shell" ("Umgang mit Datums- und Zeitvariablen im Batch").
Dort ist auch eine "GetAllDateTimeInfos.bat" dabei, die Dir diese Zerlegerei eines %date%-Werts abnimmt.
HTH Biber
Moin meto,
gesteuert wird das Ganze über ca. 8 verschiedene Klicki-Bunti-Wege in Policies, Computer-, User-, Länder- und Regionseinstellungen sowie ein paar nicht auf dokumentiertem Weg einstellbaren Windows-Versionsabhängigen Werten in der Registry.
In dem o.a Batch Tut III habe ich das mal ein wenig aufgedröselt.
Falls heute abend nichts Spannendes im Fernsehen kommt..
Grüße Biber
gesteuert wird das Ganze über ca. 8 verschiedene Klicki-Bunti-Wege in Policies, Computer-, User-, Länder- und Regionseinstellungen sowie ein paar nicht auf dokumentiertem Weg einstellbaren Windows-Versionsabhängigen Werten in der Registry.
In dem o.a Batch Tut III habe ich das mal ein wenig aufgedröselt.
Falls heute abend nichts Spannendes im Fernsehen kommt..
Grüße Biber
Habe noch eine Zusatzfrage:
Ich möchte das mein Skript zuerst die Daten spiegelt mit Robocopy und dann ein Log macht das backup.txt heisst; danach soll beee die Datei backup.txt an meine E-Mail-Adresse senden; soweit so gut, bis hierhin funktionierts. Jetzt soll die backup.txt zu archivzwecken umbennent werden in backup_aktuelles Datum.txt und hier gibt es einfach wieder Probleme. Es führt den Befehl gar nicht aus und leider weiss ich nicht genau an was es liegt...
Hier das Skript:
@echo off
@set logf=E:\Log\Backup.txt
If not exist E:\Log\Backup.txt mkdir E:\Log\
:start
echo * setzten von Datum und Uhrzeit/öffnen Logfile *
@echo S T A R T > %logf%
@date /t >> %logf%
@Time /t >> %logf%
@echo. >> %logf%
echo Replizierung in Bearbeitung
robocopy.exe "C:\Dokumente und Einstellungen\Administrator\Desktop\Test" "C:\Dokumente und Einstellungen\Administrator\Desktop\Test 2" /MIR >> %logf%
echo Errorlevel: %errorlevel% >> %logf%
@echo. >> %logf%
@set logf=
sleep 5
:Pause
C:\Programme\Beee\beee.exe -s
sleep 5
:Pause
for /F "tokens=1,2,3,4 delims=. " %a in ('date /t') do set datum=%a_%b_%c%d
echo %datum%
rename E:\Log\Backup.txt Backup_%datum%.txt
sleep 5
exit
Ich möchte das mein Skript zuerst die Daten spiegelt mit Robocopy und dann ein Log macht das backup.txt heisst; danach soll beee die Datei backup.txt an meine E-Mail-Adresse senden; soweit so gut, bis hierhin funktionierts. Jetzt soll die backup.txt zu archivzwecken umbennent werden in backup_aktuelles Datum.txt und hier gibt es einfach wieder Probleme. Es führt den Befehl gar nicht aus und leider weiss ich nicht genau an was es liegt...
Hier das Skript:
@echo off
@set logf=E:\Log\Backup.txt
If not exist E:\Log\Backup.txt mkdir E:\Log\
:start
echo * setzten von Datum und Uhrzeit/öffnen Logfile *
@echo S T A R T > %logf%
@date /t >> %logf%
@Time /t >> %logf%
@echo. >> %logf%
echo Replizierung in Bearbeitung
robocopy.exe "C:\Dokumente und Einstellungen\Administrator\Desktop\Test" "C:\Dokumente und Einstellungen\Administrator\Desktop\Test 2" /MIR >> %logf%
echo Errorlevel: %errorlevel% >> %logf%
@echo. >> %logf%
@set logf=
sleep 5
:Pause
C:\Programme\Beee\beee.exe -s
sleep 5
:Pause
for /F "tokens=1,2,3,4 delims=. " %a in ('date /t') do set datum=%a_%b_%c%d
echo %datum%
rename E:\Log\Backup.txt Backup_%datum%.txt
sleep 5
exit
hallo.
das thema ist zwar schon ein weilchen alt, da aber manche leute hier noch drin stöbern werden, noch ein paar gedanken von meiner seite zum eigentlichen problem.
die verwendung von "statischen umgebungsvariablen", das anlegen von temp-dateien und das durchsuchen dieser mit "find" finde ich an der stelle etwas umständlich. (verlorengehen der variable oder in version2 längere laufzeit des codes)
könnte auch sein, dass ich die problemstellung nicht richtig verstanden habe, aber für mich würde folgende lösung näher liegen:
##777777|%1 = original.txt##
8<----- nur_sone_idee.bat ----8<-----
@echo off & setlocal
set "datum=%date:~-10%"
set "datum=%datum:.=%"
cd /d %~dp1
set /a "counter=0"
:countup
set /a "counter+=1"
##777777|set "cntrstrng=00%counter%"##
set "targetfile=%~n1_%datum%_%cntrstrng:~-3%%~x1"
if exist "%targetfile%" goto countup
ren %1 %targetfile%
8<----- nur_sone_idee.bat ----8<-----
datum: ordentliche & sichere formatierung siehe bibers tuto no.3
%1: dieser parameter muss nicht zwingend verwendet werden, macht die batch aber universell einsetzbar. für eine datei die immer den gleichen name trägt kann man natürlich
"%~n1" durch "original"
"%~x1" durch ".txt"
ersetzen
die graue zeile könnte man auch weglassen - sieht halt nur schöner aus mit führender null.
wenn nun also am gleichen tag ein 2. backup von original.txt gemacht wird, guckt die batch ob %targetfile% schon da ist und inkrementiert den zähler bei bedarf.
#edit:
und wenn eine datei dazwischen gelöscht wird, wird die lücke halt einfach wieder gefüllt mit einer datei ....
#/edit
naja soviel zum thema counter -.-
mfg, das kleine unwissende yashi
das thema ist zwar schon ein weilchen alt, da aber manche leute hier noch drin stöbern werden, noch ein paar gedanken von meiner seite zum eigentlichen problem.
die verwendung von "statischen umgebungsvariablen", das anlegen von temp-dateien und das durchsuchen dieser mit "find" finde ich an der stelle etwas umständlich. (verlorengehen der variable oder in version2 längere laufzeit des codes)
könnte auch sein, dass ich die problemstellung nicht richtig verstanden habe, aber für mich würde folgende lösung näher liegen:
##777777|%1 = original.txt##
8<----- nur_sone_idee.bat ----8<-----
@echo off & setlocal
set "datum=%date:~-10%"
set "datum=%datum:.=%"
cd /d %~dp1
set /a "counter=0"
:countup
set /a "counter+=1"
##777777|set "cntrstrng=00%counter%"##
set "targetfile=%~n1_%datum%_%cntrstrng:~-3%%~x1"
if exist "%targetfile%" goto countup
ren %1 %targetfile%
8<----- nur_sone_idee.bat ----8<-----
datum: ordentliche & sichere formatierung siehe bibers tuto no.3
%1: dieser parameter muss nicht zwingend verwendet werden, macht die batch aber universell einsetzbar. für eine datei die immer den gleichen name trägt kann man natürlich
"%~n1" durch "original"
"%~x1" durch ".txt"
ersetzen
die graue zeile könnte man auch weglassen - sieht halt nur schöner aus mit führender null.
wenn nun also am gleichen tag ein 2. backup von original.txt gemacht wird, guckt die batch ob %targetfile% schon da ist und inkrementiert den zähler bei bedarf.
#edit:
und wenn eine datei dazwischen gelöscht wird, wird die lücke halt einfach wieder gefüllt mit einer datei ....
#/edit
naja soviel zum thema counter -.-
mfg, das kleine unwissende yashi
Hi!
Ich habe mir die hier gegebenen Informationen ausführlich durchgelesen und danke euch dafür.
Jetzt hätte ich aber ein weiteres Problem: Ich benötige im Dateinamen der umbenannten Datei die Zeit inclusive der Sekunden.
Leider bekomme ich das einfach nicht hin. Ohne Sekunden kein Problem, aber mit Sekunden bekomme ich Fehlermeldungen.
Was ist zu beachten bzw. zu ändern?
Vielen Dank für eure Hilfe
ciao
Ich habe mir die hier gegebenen Informationen ausführlich durchgelesen und danke euch dafür.
Jetzt hätte ich aber ein weiteres Problem: Ich benötige im Dateinamen der umbenannten Datei die Zeit inclusive der Sekunden.
Leider bekomme ich das einfach nicht hin. Ohne Sekunden kein Problem, aber mit Sekunden bekomme ich Fehlermeldungen.
Was ist zu beachten bzw. zu ändern?
Vielen Dank für eure Hilfe
ciao
Sorry, Rashtamoon,
hatte zu flüchtig gelesen.
Wenn Du von einem Datei-Datum die Sekunden brauchst und nicht von der Systemzeit, ist mir unter dem CMD-Interpreter auch kein Weg/kein M$-Utility bekannt, das die Sekunden mit ausgibt/anzeigt.
Der normale DIR-Befehl zeigt jedenfalls die Zeit immer nur als hh:mm an.
Also wird der Umweg wahrscheinlich über einen VBS-Schnipsel gehen müssen oder über ein Freeware-Utility (falls existent). Werden bei Dir denn mehrere Dateien pro Sekunde angelegt?
Gruß
Biber
hatte zu flüchtig gelesen.
Wenn Du von einem Datei-Datum die Sekunden brauchst und nicht von der Systemzeit, ist mir unter dem CMD-Interpreter auch kein Weg/kein M$-Utility bekannt, das die Sekunden mit ausgibt/anzeigt.
Der normale DIR-Befehl zeigt jedenfalls die Zeit immer nur als hh:mm an.
Also wird der Umweg wahrscheinlich über einen VBS-Schnipsel gehen müssen oder über ein Freeware-Utility (falls existent). Werden bei Dir denn mehrere Dateien pro Sekunde angelegt?
Gruß
Biber
Hallo Biber,
nein, du hast glaub ich schon recht verstanden.
Ich will eine Datei xxx.txt umbenennen in Datum_Zeit.txt.
Geht ja auch wunderbar, nur muss ich in der Zeit eben die Sekunden reinbekommen, das schaff ich nicht bisher.
Ich dachte eigentlich am Anfang es geht so simpel mit rename xxx.txt "xxx_%date%_%time%.txt"
Haut aber wie gesagt nicht hin.
Ja, es kommen Dateien von extern in ein Inboundverzeichnis und die werden dann alle 10 Minuten oder so umkopiert und umbenannt. Deshalb kann es vorkommen, daß im Inbound mehrere Dateien stehen und die würden dann innerhalb einer Minute kopiert.
Deshalb denke ich brauche ich die Sekunden im Dateinamen, sonst würde er die ja teilweise überschreiben, oder?
Ich dachte immer, ich kenn mich halbwegs aus mit batches, aber was ich hier so lese ist mir teilweise völlig neu
ciao
nein, du hast glaub ich schon recht verstanden.
Ich will eine Datei xxx.txt umbenennen in Datum_Zeit.txt.
Geht ja auch wunderbar, nur muss ich in der Zeit eben die Sekunden reinbekommen, das schaff ich nicht bisher.
Ich dachte eigentlich am Anfang es geht so simpel mit rename xxx.txt "xxx_%date%_%time%.txt"
Haut aber wie gesagt nicht hin.
Ja, es kommen Dateien von extern in ein Inboundverzeichnis und die werden dann alle 10 Minuten oder so umkopiert und umbenannt. Deshalb kann es vorkommen, daß im Inbound mehrere Dateien stehen und die würden dann innerhalb einer Minute kopiert.
Deshalb denke ich brauche ich die Sekunden im Dateinamen, sonst würde er die ja teilweise überschreiben, oder?
Ich dachte immer, ich kenn mich halbwegs aus mit batches, aber was ich hier so lese ist mir teilweise völlig neu
ciao
Hm, Rashtamoon,
kommt darauf an, ob und wie die Dateien wiederfinden musst.
Wenn Du Deinen ersten Minimal-Ansatz ("Ich will eine Datei xxx.txt umbenennen in Datum_Zeit.txt.") umsetzen willst, kommst Du ja nach einem Test am CMD-Prompt darauf, dass da
a) nicht erlaubte Zeichen drin sind
b) die Sortierung absolut grottig wird bei mehreren umbenannten Dateien.
$cmd$echo %date% %time%
24.03.2006 19:02:54,18
würde ja beim Umbenennen mit...
"ren ?.txt %date% %time%.txt" heißen:
$cmd$ren x.txt 24.03.2006_19:02:54,18.txt
$cmd$ren ü.txt 24.03.2006_19:02:54,18.txt
...ist mit den ":" nicht erlaubt, mit dem Komma unschön und die vielen Punkte im Dateinamen sind auch nicht hilfreich.
Wenn Du trotzdem sinngemäß bei dieser Variante bleiben willst, solltest Du zumindest die Punkte im Datum %date%, die Kommata und die Doppelpunkte in der Zeit %time% ersetzen wie in den oberen Postings gezeigt.
Bsp:
$cmd$set "timestamp=%date%_%time%"
$cmd$set time
timestamp=24.03.2006_19:09:25,62
........Ersetze alle Leerzeichen
$cmd$set timestamp=%timestamp: =%
........Ersetzte alle Punkte
$cmd$set timestamp=%timestamp:.=%
...ersetze alle Doppelpunkte
$cmd$set timestamp=%timestamp::=%
...ersetze alle Kommata
$cmd$set timestamp=%timestamp:,=%
...timestamp=timestamp=24032006_19092562
oder, zwei Zeilen weiter im Batch dann
.. ren ü.txt %timestamp%.txt.
(==ren ü.txt 24032006_19092562.txt.)
Gruß Biber
kommt darauf an, ob und wie die Dateien wiederfinden musst.
Wenn Du Deinen ersten Minimal-Ansatz ("Ich will eine Datei xxx.txt umbenennen in Datum_Zeit.txt.") umsetzen willst, kommst Du ja nach einem Test am CMD-Prompt darauf, dass da
a) nicht erlaubte Zeichen drin sind
b) die Sortierung absolut grottig wird bei mehreren umbenannten Dateien.
$cmd$echo %date% %time%
24.03.2006 19:02:54,18
würde ja beim Umbenennen mit...
"ren ?.txt %date% %time%.txt" heißen:
$cmd$ren x.txt 24.03.2006_19:02:54,18.txt
$cmd$ren ü.txt 24.03.2006_19:02:54,18.txt
...ist mit den ":" nicht erlaubt, mit dem Komma unschön und die vielen Punkte im Dateinamen sind auch nicht hilfreich.
Wenn Du trotzdem sinngemäß bei dieser Variante bleiben willst, solltest Du zumindest die Punkte im Datum %date%, die Kommata und die Doppelpunkte in der Zeit %time% ersetzen wie in den oberen Postings gezeigt.
Bsp:
$cmd$set "timestamp=%date%_%time%"
$cmd$set time
timestamp=24.03.2006_19:09:25,62
........Ersetze alle Leerzeichen
$cmd$set timestamp=%timestamp: =%
........Ersetzte alle Punkte
$cmd$set timestamp=%timestamp:.=%
...ersetze alle Doppelpunkte
$cmd$set timestamp=%timestamp::=%
...ersetze alle Kommata
$cmd$set timestamp=%timestamp:,=%
...timestamp=timestamp=24032006_19092562
oder, zwei Zeilen weiter im Batch dann
.. ren ü.txt %timestamp%.txt.
(==ren ü.txt 24032006_19092562.txt.)
Gruß Biber
Thx, yashi,
da im Moment das Batch-Tut-III nicht angezeigt wird, eine Kurzvariante zu Rashtomoons Frage. Aber Deine Lösung geht im deutschen Standard-Win genauso.
Falls mit "Wochentag rausbekommen" "Wochentag wegbekommen" gemeint war:
Am CMD-Prompt:
(=15:52:59 D:\temp=)
@for %i in (%date%) do @for /f "tokens=1-3 delims=." %a in ("%i") do set "datestr=%c-%b-%a"
set "datestr=2006-03-27"
So lassen sich die umbenannten Dateien besser sortieren.
Im Batch jeweils zwei Prozentzeichen bei den Zählvariablen statt einem.
Grüße Biber
da im Moment das Batch-Tut-III nicht angezeigt wird, eine Kurzvariante zu Rashtomoons Frage. Aber Deine Lösung geht im deutschen Standard-Win genauso.
Falls mit "Wochentag rausbekommen" "Wochentag wegbekommen" gemeint war:
Am CMD-Prompt:
(=15:52:59 D:\temp=)
@for %i in (%date%) do @for /f "tokens=1-3 delims=." %a in ("%i") do set "datestr=%c-%b-%a"
set "datestr=2006-03-27"
So lassen sich die umbenannten Dateien besser sortieren.
Im Batch jeweils zwei Prozentzeichen bei den Zählvariablen statt einem.
Grüße Biber
Hallo,
ich möchte Dateien (egal mit welcher Endung !!!) umbenennen.
z.B. test.doc -> test_27092006.doc
Habe auch schon einen Ansatz gefunden nur das mir hier die Aenderung an
den Dateianfang gesetzt wird.
lfnfor on
for %%a in (test*.*) do ren %%a %date%%%a
Am besten wäre natürlich wenn Unterordner mit einbezogen würden.
Ich zähle auf Euch
ich möchte Dateien (egal mit welcher Endung !!!) umbenennen.
z.B. test.doc -> test_27092006.doc
Habe auch schon einen Ansatz gefunden nur das mir hier die Aenderung an
den Dateianfang gesetzt wird.
lfnfor on
for %%a in (test*.*) do ren %%a %date%%%a
Am besten wäre natürlich wenn Unterordner mit einbezogen würden.
Ich zähle auf Euch
Alter Schwede was passiert hier ?????
for /r %%a in (test*.*) do ren "%%~dpna" "%%~na%mydate%%%~xa"
~dpna ??????
~na ?????
~xa ??????
Irgendwie passiert bei mir nichts !!!!
Könntest du mir diese Zeile etwas genauer erläutern ???
Jetzt habe ich gerade gedacht das ich den Einstieg in batches so lala schaffe und dann
kommst Du mit sowas
Schönen Tag noch mach jetzt Feierabend
Herby
for /r %%a in (test*.*) do ren "%%~dpna" "%%~na%mydate%%%~xa"
~dpna ??????
~na ?????
~xa ??????
Irgendwie passiert bei mir nichts !!!!
Könntest du mir diese Zeile etwas genauer erläutern ???
Jetzt habe ich gerade gedacht das ich den Einstieg in batches so lala schaffe und dann
kommst Du mit sowas
Schönen Tag noch mach jetzt Feierabend
Herby
Na, Herby,
seit DOS 3.11 keine Batcherei mehr gemacht?
M$ hat sich da schon bewegt...
Spiel mal hiermit.
Output des obigen Schnipsels:
Beispiel: wenn in der FOR..IN..DO..-Anweisung die Datei y:\bsp\test1.doc angefasst wird:
%%~dpnxa ?????? = Drive + Path + Name +eXtension der Datei in %%a = y:\bsp\test1.doc
%%~na ????? = Name der Datei in Zählvariable %%a = test1
%%~xa ??????= eXtension der Datei in Zählvariable %%a = .doc
Gruß
Biber
P.S.
Derartige Admin-Probleme kann ich leider nicht lösen ... *feixxxxx*
seit DOS 3.11 keine Batcherei mehr gemacht?
M$ hat sich da schon bewegt...
Spiel mal hiermit.
:: snipp RenameTestHerby.bat ------optionaler Parameter Dateinamensanfang
:: Beispiel: RenameHerbyTest test ---> würde alle Dateien test*.* mit Datumsstempel versehen.
:: -->@for /f "tokens=2-4 delims=. " %%a in ("%date%") do @set "mydate=_%%a%%b%%c"
::--- damit es nicht an der Datumsformatierung von %date% scheitert, mach ich mal hier
:: eine Konvertierung von einem "festen" String ("Mi 27.09.2006")
@for /f "tokens=2-4 delims=. " %%a in ("Mi 27.09.2006") do @set "mydate=_%%a%%b%%c"
REM %%mydate%% hat nun den Wert "%mydate%"; umbenannt werden alle Dateien "%**.*"
@for /r %%a in ("%**.*") do @echo ren "%%~dpnxa" "%%~na%mydate%%%~xa"
>RenameTestHerby.bat def
Y:\Eigene Dateien>
>REM %mydate% hat nun den Wert "_27092006"; umbenannt werden alle Dateien "def*.*"
ren "Y:\Eigene Dateien\Eigene Musik\DEFAULT.PLS" "DEFAULT_27092006.PLS"
ren "Y:\Eigene Dateien\totalcmd\DEFAULT.BAR" "DEFAULT_27092006.BAR"
ren "Y:\Eigene Dateien\totalcmd\default.br1" "default_27092006.br1"
Beispiel: wenn in der FOR..IN..DO..-Anweisung die Datei y:\bsp\test1.doc angefasst wird:
%%~dpnxa ?????? = Drive + Path + Name +eXtension der Datei in %%a = y:\bsp\test1.doc
%%~na ????? = Name der Datei in Zählvariable %%a = test1
%%~xa ??????= eXtension der Datei in Zählvariable %%a = .doc
Gruß
Biber
P.S.
Irgendwie passiert bei mir nichts !!!!
Oh... musst Dich doch nicht gleich vor allen outen... Derartige Admin-Probleme kann ich leider nicht lösen ... *feixxxxx*
bei mir wird das Datum mehrfach angehängt, von 2-4mal, keine Ahnung warum !!!!
Das liegt daran, dass Du den Batch 2-4mal aufgerufen hast.Habe eine direkte Abhängigkeit eingebaut:
- 1x aufrufen = 1x Datum anhängen,
- 27x aufrufen = 27x Datum anhängen.
Was die FOR /F-Anweisung bedeutet, siehe unter FOR /? am CMD-Prompt.
Oder in dem gestern angegebenen Tutorial.
Oder in den 2000 FOR..IN..DO-Beispielen hier im Forum.
Gruß
Biber
Hallo Biber,
das ist beim einmaligen Aufruf so.
Ich habe insgesamt 5Dateien in dem Ordner, wobei 2x das Datum 3fach angehängt,
2x das Datum 2fach angehängt und einmal das Datum 4fach angehängt wird.
Das Script wurde von mir so verändert: do @echo ren -> do ren, da ansonsten nichts gemacht wurde, das ist doch richtig, oder ????
Mir ging es bei meiner Frage was diese Zeile macht:
@for /f "tokens=2-4 delims=. " %%a in ("Mi 27.09.2006") do @set "mydate=_%%a%%b%%c"
um die Funktion tokens delims, kann darüber leider nichts finden
Mit besten Dank
Herby
das ist beim einmaligen Aufruf so.
Ich habe insgesamt 5Dateien in dem Ordner, wobei 2x das Datum 3fach angehängt,
2x das Datum 2fach angehängt und einmal das Datum 4fach angehängt wird.
Das Script wurde von mir so verändert: do @echo ren -> do ren, da ansonsten nichts gemacht wurde, das ist doch richtig, oder ????
Mir ging es bei meiner Frage was diese Zeile macht:
@for /f "tokens=2-4 delims=. " %%a in ("Mi 27.09.2006") do @set "mydate=_%%a%%b%%c"
um die Funktion tokens delims, kann darüber leider nichts finden
Mit besten Dank
Herby
Moin herby_z,
kann den von Dir gemeldeten Fehler nicht reproduzieren, sorry.
Zu dem FOR /F -Aufruf findet sich in der noch umfangreicheren FOR/?-Hilfe am CMD-Prompt folgendes:
Sorry, dass ich nicht besser helfen konnte.
Vielleicht hat ja jemand anders eine Lösung.
Gruß
Biber
kann den von Dir gemeldeten Fehler nicht reproduzieren, sorry.
Zu dem FOR /F -Aufruf findet sich in der noch umfangreicheren FOR/?-Hilfe am CMD-Prompt folgendes:
FOR /F ["Optionen"] %Variable IN (Dateiensatz) DO Befehl [Parameter]
FOR /F ["Optionen"] %Variable IN ("Zeichenkette") DO Befehl [Parameter]
FOR /F ["Optionen"] %Variable IN (Befehl) DO Befehl [Parameter]
oder, unter Verwendung der Option "usebackq":
FOR /F ["Optionen"] %variable IN (Dateiensatz) DO Befehl [Parameter]
FOR /F ["Optionen"] %variable IN ('Zeichenkette') DO Befehl [Parameter]
FOR /F ["Optionen"] %variable IN (`Befehl`) DO Befehl [Parameter]
Der Dateiensatz besteht aus einem oder mehreren Dateinamen. Jede Datei
wird geöffnet, gelesen und bearbeitet, dann wird mit der nächsten Datei
des Satzes fortgefahren. Die Bearbeitung einer Datei erfolgt zeilenweise,
jede einzelne Textzeile wird ausgewertet und in die entsprechenden Token
(keinen oder mehrere) zerlegt. Die Befehle in der FOR-Schleife werden dann
mit den Variablenwerten (d.h. den gefunden Zeichenketten bzw. Token)
aufgerufen. Standardmäßig liefert /F den ersten, durch ein Leerzeichen
getrennten Token von jeder Zeile in jeder Datei. Leerzeilen werden
übersprungen. Das standardmäßige Verhalten bei der Analyse kann wahlweise
durch den Parameter "Optionen" überschrieben werden. Das ist eine
Zeichenkette in Anführungszeichen, welche eines oder mehrere Schlüssel-
wörter enthält, um verschiedene Parameter für die Analyse anzugeben. Diese
Schlüsselwörter sind:
eol=c - Gibt das Zeichen für Zeilenendekommentare an
(nur eins).
skip=n - Gibt die Anzahl der Zeilen an, die am Anfang einer
Datei übersprungen werden.
delims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen
die Standardtrennzeichen TAB und Leerzeichen.
tokens=x,y,m-n - Gibt an, welche Token von jeder Zeile an die
FOR-Schleife weitergegeben werden.
Das führt dazu, dass zusätzliche Variablen erzeugt
werden. Mit der Form m-n wird dabei ein Bereich vom
m-ten bis zum n-ten Token angegeben. Wenn das letzte
Zeichen ein Sternchen ist, wird eine zusätzliche
Variable deklariert, die den verbleibenden Text
dieser Zeile enthält.
usebackq - Gibt an, dass die neue Semantik in Kraft ist,
wobei eine Zeichenkette in umgekehrten Anführungs-
zeichen als Befehl ausgeführt wird und eine
Zeichenkette in Anführungszeichen ein literaler
Befehl ist, der die Verwendung von doppelten
Anführungszeichen um Dateinamen in Dateinamens-
sätzen erlaubt.
Einige Beispiele:
FOR /F "eol=; tokens=2,3* delims=, " %i in (Datei.txt) do @echo %i %j %k
Dadurch wird jede Zeile in der Datei Datei.txt ausgewertet, Zeilen die
mit einem Semikolon beginnen werden ignoriert, für den 2. und 3. Token
jeder Zeile werden die Befehle in der FOR-Schleife ausgeführt. Trenn-
zeichen sind Kommas und/oder Leerzeichen. In der FOR-Schleife wird der
Ausdruck %i verwendet, um den 2. Token zu erhalten, %j für den 3. Token
und %k, um alle übrigen Token zu erhalten. Dateinamen, die Leerzeichen
enthalten, müssen Sie innerhalb doppelter Anführungszeichen angeben. Dazu
müssen Sie die Option "usebackq" verwenden. Andernfalls werden doppelte
Anführungszeichen zur Definition eines auszuwertenden Literals
verwendet.
Dabei ist %i explizit deklariert, während %j und %k implizit durch die
Option "tokens=" deklariert werden. Sie können bis zu 26 Token durch diese
Option angeben, vorausgesetzt, es wird dadurch nicht versucht, eine
Variable mit einem Buchstaben größer als 'z' zu deklarieren. Bedachten
Sie, dass FOR-Variablen aus nur einem Buchstaben bestehen, Groß-/Klein-
schreibung beachtet werden muss, dass sie global sind und nicht mehr als
insgesamt 52 gleichzeitig aktiv sein dürfen.
Sie können den Befehl FOR /F auch direkt mit einer Zeichenkette verwenden,
indem Sie die Zeichenkette in doppelten Anführungszeichen als Dateiensatz
zwischen den Klammern angeben. Diese Zeichenkette wird dabei als
einzelne Zeile einer Datei betrachtet und ausgewertet.
Schließlich können Sie den Befehl FOR /F auch verwenden, um die Ausgabe
eines Befehls auszuwerten. Dazu geben Sie eine Zeichenkette in einfachen
Anführungszeichen als Dateiensatz zwischen den Klammern an. Diese
Zeichenkette wird dabei als Befehlszeile betrachtet und von einer unter-
geordneten CMD.EXE ausgeführt. Die Ausgabe dieses Befehls wird dann wie
eine normale Datei ausgewertet. Das folgende Beispiel listet die Um-
gebungsvariablen im aktuellen Verzeichnis auf:
FOR /F " usebackq delims==" %i IN ((`set`) DO @echo %i
Sorry, dass ich nicht besser helfen konnte.
Vielleicht hat ja jemand anders eine Lösung.
Gruß
Biber