liedad
Goto Top

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

Content-Key: 7662

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

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: meto
meto 08.03.2005 um 16:39:31 Uhr
Goto Top
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
Mitglied: liedad
liedad 09.03.2005 um 07:31:59 Uhr
Goto Top
Vielen Dank an Meto. Mit der Uhrzeit ist das auch machbar. Doch da ich mich nun schon mal auf das Problem mit fortlaufenden Zähler gestoßen bin, interessiert es mich schon wie man so etwas lösen kann. Dazu müsste eine Variable im System initialisiert werden, welche dann bei jedem Aufruf der Batch hochgezählt wird. Doch meine Versuche mit 'SET' wren nicht erfolreich.
Wo liegt mein Fehler.

rem echo off
rem Umbenennen der Importdatei
SET /A DATZ = %DATZ%+1
REM SET /A G = %%G%+1
FOR /F "tokens=1,2,3,4,5 delims=/. " %%a in ('date/T') do set CDATE=%%b%%c%%d

ren orginal.txt orginal%cdate%_%DATZ%.txt

Gruß Liedad
Mitglied: meto
meto 09.03.2005 um 08:05:57 Uhr
Goto Top
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
Mitglied: liedad
liedad 09.03.2005 um 10:44:31 Uhr
Goto Top
Danke an Meto für den Hinweis auf die Systemvariable, einmal wird die Variable DATZ beim Aufruf der Batch hochgezählt, jedoch müsste dann die Systemvariable auch um den Wert 1 hochgezählt werden, damit beim nächsten Aufruf der Batch die Variable DATZ wieder um 1 erhöht wird.

rem Umbenennen der Importdatei
SET /A DATZ=%DATZ%+1
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 orginal.txt orginal%dateiname%_%DATZ%.txt
set dateiname=

Meto kannst du die Überprüfung auf das Vorhandensein eines Dateinamens oder des geänderten Datums mal näher erläutern?

Dank an Meto
Mitglied: meto
meto 09.03.2005 um 11:02:16 Uhr
Goto Top
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
Mitglied: liedad
liedad 09.03.2005 um 11:39:43 Uhr
Goto Top
Meto Danke für deine Ausführungen. Wird die Variable schon nach dem Anlegen hochgezählt oder erst nach einem Neustart des Systems? Denn so oft ich auch die Batch starte, die DATZ bleibt bei 2 stehen nachdem sie beim ersten Aufruf der Batch um 1 erhöht wurde.
Mitglied: meto
meto 09.03.2005 um 15:49:22 Uhr
Goto Top
Mein Fehler. Kann auch nicht funktionieren, weil auch die Änderungen einer Systemvariable nur temporär sind. Arbeite aber schon an einer anderen Lösung.

Gruß
Meto
Mitglied: meto
meto 10.03.2005 um 09:37:14 Uhr
Goto Top
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
Mitglied: liedad
liedad 10.03.2005 um 11:49:40 Uhr
Goto Top
Super Meto, jetzt funktioniert die Umbenennung ganz komfortabel. Wieder was gelernt face-smile

Dank und Gruß Liedad
Mitglied: Bromer
Bromer 24.01.2006 um 11:13:42 Uhr
Goto Top
Ich bin ein newbie in Sachen Skripts programmieren und ich möchte etwas ähnliches machen. Ich möchte einfach eine Log-Datei die momentan backup.txt heisst in backup_aktuelles Datum.txt umbenennen. Wie kann man soetwas programmieren?

Wäre sehr dankbar für eure Hilfe.
Mitglied: meto
meto 24.01.2006 um 11:52:08 Uhr
Goto Top
Versuchs damit:

ren backup.txt backup_%date%.txt
Mitglied: Bromer
Bromer 24.01.2006 um 11:58:11 Uhr
Goto Top
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?
Mitglied: meto
meto 24.01.2006 um 12:17:00 Uhr
Goto Top
Von welchem Betriebssystem reden wir? Bein WinXP Pro gehts definitiv.
Mitglied: Bromer
Bromer 24.01.2006 um 12:19:19 Uhr
Goto Top
Ich probiere es momentan auch an einem Win XP SP2, aber nachher sollte es dann auf eine SBS 2003 Server laufen...
Mitglied: meto
meto 24.01.2006 um 12:51:33 Uhr
Goto Top
Das geht!
Hast du das schon mal in einem CMD Fenster probiert?
Mitglied: 8644
8644 24.01.2006 um 12:58:23 Uhr
Goto Top
Hi,

setzt mal die Variable in Anführungszeichen!

Psycho

Klug ist jeder - der eine vorher, der andere hinterher
Mitglied: meto
meto 24.01.2006 um 16:11:56 Uhr
Goto Top
Wenn Anführungszeichen, dann der ganze Dateiname. Sollte aber auch ohne gehen. Funktioniert bei mir aus einer Batch und auf Kommandozeile.
Mitglied: Biber
Biber 24.01.2006 um 17:56:55 Uhr
Goto Top
@meto
Wenn Anführungszeichen, dann der ganze Dateiname.
Jepp.
Sollte aber auch ohne gehen
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
Mitglied: meto
meto 24.01.2006 um 18:14:15 Uhr
Goto Top
Stimmt. Dieses Datumsformat hatte ich nicht bedacht. Wo wird denn eigendlich gesteuert, wann das Datum wie ausgegeben wird?
Mitglied: Biber
Biber 24.01.2006 um 18:43:39 Uhr
Goto Top
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.. face-wink

Grüße Biber
Mitglied: Bromer
Bromer 25.01.2006 um 15:43:13 Uhr
Goto Top
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
Mitglied: Biber
Biber 25.01.2006 um 15:52:03 Uhr
Goto Top
Steht doch da, Bromer,

for /F "tokens=1,2,3,4 delims=. " %a in ('date /t') do set datum=%a_%b_%c%d
...wäre richtig vom CMD-Prompt.

for /F "tokens=1,2,3,4 delims=. " %%a in ('date /t') do set datum=%%a_%%b_%%c%%d
..ist richtig im Bätch (doppelte Prozentzeichen bei FOR-Zählvariablen).

HTH Biber
Mitglied: Bromer
Bromer 25.01.2006 um 16:04:56 Uhr
Goto Top
ach jo, hab ich nicht ganz gecheckt, danke schön. Habe auch noch gemerkt, dass ich bei rename die Anführungs- und Schlusszeichen machen muss...

Danke schön.
Mitglied: yashi
yashi 04.03.2006 um 14:55:47 Uhr
Goto Top
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
Mitglied: Rashtamoon
Rashtamoon 24.03.2006 um 14:29:23 Uhr
Goto Top
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
Mitglied: Biber
Biber 24.03.2006 um 14:40:28 Uhr
Goto Top
Moin Rashtomoon,

versuch so anzufangen (am CMD-Prompt):
$cmd$for /f "tokens=1-4 delims=:," %i in ("%time%") do @echo %time%:[%i%j%k%l]

Ausgabe sollte sein:
14:37:39,92:[14373992]

HTH Biber
Mitglied: Rashtamoon
Rashtamoon 24.03.2006 um 16:19:25 Uhr
Goto Top
Hi Biber,

danke für die schnelle Antwort.

Ja, die Ausgabe ist wie von Dir beschrieben.

Und nun?

ciao
Mitglied: Biber
Biber 24.03.2006 um 17:36:07 Uhr
Goto Top
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
Mitglied: Rashtamoon
Rashtamoon 24.03.2006 um 17:54:37 Uhr
Goto Top
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 face-smile

ciao
Mitglied: Biber
Biber 24.03.2006 um 19:17:27 Uhr
Goto Top
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
Mitglied: Rashtamoon
Rashtamoon 27.03.2006 um 13:53:11 Uhr
Goto Top
Hallo Biber,

vielen Dank für Deine umgehende Unterstützung, das war genau das was ich brauche.

Kannst Du mir noch sagen, wie ich den Wochentag aus dem Dateinamen rausbekomme?

Dann wär's perfekt face-smile

ciao
Rashtamoon
Mitglied: yashi
yashi 27.03.2006 um 14:56:18 Uhr
Goto Top
%date:~-10%
liefert nur die letzten 10 Zeichen aus dem Datums-string
also
Mo, 27.03.2006
wird zu
27.03.2006

und
set "datum=%date:~-10%"  
set "datum=%datum:.=%"  

liefert:
27032006

Kannst auch mal in Bibers Tuto #3 gucken - da ist es bugresistenter aufgeführt...


mfg
Mitglied: Biber
Biber 27.03.2006 um 16:03:25 Uhr
Goto Top
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
Mitglied: Herby-z
Herby-z 27.09.2006 um 11:03:24 Uhr
Goto Top
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 face-smile
Mitglied: Biber
Biber 27.09.2006 um 12:47:11 Uhr
Goto Top
Moin herby_z,

for /r %%a in (test*.*) do ren "%%~dpnxa" "%%~na%mydate%%%~xa"  

Wobei Du %mydate% nach Deinen Wünschen aus %date% ableiten musst (s.o.).

Gruß
Biber
Mitglied: Herby-z
Herby-z 27.09.2006 um 15:02:26 Uhr
Goto Top
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 face-smile

Schönen Tag noch mach jetzt Feierabend
Herby
Mitglied: Biber
Biber 27.09.2006 um 16:40:40 Uhr
Goto Top
Na, Herby,

seit DOS 3.11 keine Batcherei mehr gemacht? face-wink
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"  
Output des obigen Schnipsels:
>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... face-wink
Derartige Admin-Probleme kann ich leider nicht lösen ... *feixxxxx*
Mitglied: Herby-z
Herby-z 28.09.2006 um 15:16:18 Uhr
Goto Top
Hallo,

bei mir wird das Datum mehrfach angehängt, von 2-4mal, keine Ahnung warum !!!!

Was diese Zeile macht ist mir auch schleierhaft:
@for /f "tokens=2-4 delims=. " %%a in ("Mi 27.09.2006") do @set "mydate=_%%a%%b%%c"

Vielleicht check ich es ja doch noch irgendwann !?!?!?!

Gruss
Herby
Mitglied: Biber
Biber 28.09.2006 um 16:36:16 Uhr
Goto Top
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
Mitglied: Herby-z
Herby-z 29.09.2006 um 07:48:37 Uhr
Goto Top
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
Mitglied: Biber
Biber 29.09.2006 um 11:01:54 Uhr
Goto Top
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:
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
Mitglied: Herby-z
Herby-z 29.09.2006 um 11:09:31 Uhr
Goto Top
Danke, da hätte ich auch selbst drauf kommen können face-sad