Beim ausführen einer Batch kopien von Files erstellen
Hallo Leute,
vorkurzem habe ich in einem Post gesehen das einer ne Lösung gesucht hat um kopien von logfiles (inkl. Datum und Uhrzeit) zu erstellen. Das hätte ich gerne auch für etwas nur bin ich Batch Neuling und benötige das auch nur einmal
) Habe auch schon bibers Batch for runaways gelesen...naja irgendwie komm ich nicht zurecht.
Ich möchte folgendes machen:
1. Ich möchte, immer wenn ich ein BackupBatch ausführe das meine logfiles mit Datum und Uhrzeit an den filenamen angehängt werden....
ALSO:
Quelle---> C\Prgal\license.log
ZIEL---> C:\BACKUP\license.log.20100810_16:40:00
Geht das ungefähr so:
vorkurzem habe ich in einem Post gesehen das einer ne Lösung gesucht hat um kopien von logfiles (inkl. Datum und Uhrzeit) zu erstellen. Das hätte ich gerne auch für etwas nur bin ich Batch Neuling und benötige das auch nur einmal
Ich möchte folgendes machen:
1. Ich möchte, immer wenn ich ein BackupBatch ausführe das meine logfiles mit Datum und Uhrzeit an den filenamen angehängt werden....
ALSO:
Quelle---> C\Prgal\license.log
ZIEL---> C:\BACKUP\license.log.20100810_16:40:00
Geht das ungefähr so:
REM Datumsvariablen systemspezifisch aufbereiten
if %windir%==C:\WINDOWS for /f "tokens=1-3 delims=. " %%a in ('date /t') do set dd=%%a&set mm=%%b&set yyyy=%%c
if %windir%==C:\WINDOWS for /f "tokens=1-2 delims=:" %%a in ('time /t') do set hh=%%a&set mi=%%b
xcopy C:\Prgal\license.log C:\BACKUP\license.log
renC:\BACKUP\license.logg license.log%%hh%%-%%mi%%
....
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 148729
Url: https://administrator.de/forum/beim-ausfuehren-einer-batch-kopien-von-files-erstellen-148729.html
Ausgedruckt am: 03.04.2025 um 15:04 Uhr
18 Kommentare
Neuester Kommentar
Moin winlin,
willkommen im Forum.
Natürlich bekommst du hier Hilfe und (wenn du darauf bestehst) auf Antworten auf exakt die Frage, die du gestellt hast.
Dennoch - vorher versuche ich noch mal, dich davon abzubringen.
--> Kein guter Plan.
XCopy (und die ganzen anderen xy--robo-usw-copy-Befehle haben zwei sehr nützliche Features, die der normale Copy-Befehl nicht per se mitbringt.
a) das offensichtliche... die kopieren eben auch eine Unterverzeichnisstruktur, nicht nur explizit von Quellverzeichnis nach Zielverzeichnis.
b) und genau so nützlich: die können alle kopieren nur die älteren/die nicht vorhandenen/die vorhandenen/die geänderten... Dateien.
Das zweite Feature - nämlich das du doch nicht jedesmal alle 140000 Dateien nochmal sichern musst, weil sich zwei Dateien geändert haben- das hebelst du aus.
Du machst mit deiner Mimik
--> Ich würde den Plan ändern auf
--> auf jeden Fall erstmal die Strategie überdenken.
Grüße
Biber
willkommen im Forum.
Natürlich bekommst du hier Hilfe und (wenn du darauf bestehst) auf Antworten auf exakt die Frage, die du gestellt hast.
Dennoch - vorher versuche ich noch mal, dich davon abzubringen.
--> Kein guter Plan.
XCopy (und die ganzen anderen xy--robo-usw-copy-Befehle haben zwei sehr nützliche Features, die der normale Copy-Befehl nicht per se mitbringt.
a) das offensichtliche... die kopieren eben auch eine Unterverzeichnisstruktur, nicht nur explizit von Quellverzeichnis nach Zielverzeichnis.
b) und genau so nützlich: die können alle kopieren nur die älteren/die nicht vorhandenen/die vorhandenen/die geänderten... Dateien.
Das zweite Feature - nämlich das du doch nicht jedesmal alle 140000 Dateien nochmal sichern musst, weil sich zwei Dateien geändert haben- das hebelst du aus.
Du machst mit deiner Mimik
- jedesmal eine Komplettsicherung und
- hast hinterher außerdem "Datei A" und "Eins-zu-Eins-Kopie von Datei A" unter verschiedenen Namen vorliegen.
- und - mal zwei Wochen weiter denken... sobald du mal eine Datei "DeineDatei.xyz-2010-08-10_111213" sicherst--> die heisst dann ""MeineDatei.xyz-2010-08-10_111213_2010-08-11_202122". Da wirst du relativ schnell albern bei.
--> Ich würde den Plan ändern auf
- entweder alles "VOLL" sichern in ein Backup-Verzeichnis mit Tagesdatum (z.B. F:\Backups\2010\2010-08-10_111213), aber Dateinamen_neu bleiben gleich Dateinamen_alt
- oder alles INKREMENTELL (nur die geänderten Dateien sichern in ein Backup-Verzeichnis mit Kennzeichen "Inkrementell"+Tagesdatum); Dateinamen bleiben
- oder alles sichernswerte zusammenzippen in einen Datenklumpen mit Tagesdatum; Originaldateinamen bleiben
- .... (oder 34 andere beliebte Varianten einer Sicherung)
--> auf jeden Fall erstmal die Strategie überdenken.
Grüße
Biber

auch von mir ein Hello - come in and find out.
Was ich aber mal loswerden muß - ist:
(OT)
Ja ist denn schon wieder Weihnachten?
(/OT)
@Biber - ich widerschreibe dir ja höchst ungern, aber er will doch nur die (das eine) logfile wegsichern.
Im Prinzip gebe ich Biber recht und wegen Strategie überdenken - such hier mal nach 7zip Kommandzeile Datum.
Ist wahrscheinlich für eine txt Datei die gesammelt werden soll - der platzsparendste Weg.
- Zeitgesteuerte zippen von Dateien durch batch
PS: "Time/T" kann nur Stunde-minute - du müsstest via echo %time% arbeiten, wenn du die sekunden dazu haben willst.
ungetestet
gruß
Was ich aber mal loswerden muß - ist:
(OT)
- Endlich mal ein "Neuer" - der
- eine Zeile des Grußes für uns übrig hat (wobei das ja viele jungspundalthasen auch nicht können)
- codeblöcke ohne mit dem Finger drauf zu zeigen
- funktionierende Shift Taste
- kein @€cho off im Testlabor
Ja ist denn schon wieder Weihnachten?
(/OT)
@Biber - ich widerschreibe dir ja höchst ungern, aber er will doch nur die (das eine) logfile wegsichern.
Im Prinzip gebe ich Biber recht und wegen Strategie überdenken - such hier mal nach 7zip Kommandzeile Datum.
Ist wahrscheinlich für eine txt Datei die gesammelt werden soll - der platzsparendste Weg.
- Zeitgesteuerte zippen von Dateien durch batch
PS: "Time/T" kann nur Stunde-minute - du müsstest via echo %time% arbeiten, wenn du die sekunden dazu haben willst.
ungetestet
if %windir%==C:\WINDOWS (
for /f "tokens=1-3 delims=. " %%a in ('date /t') do set dd=%%a & set mm=%%b & set yyyy=%%c
for /f "tokens=1,2,3 delims=: " %%a in ('echo %time%') do set hh=%%a & set mi=%%b & set sec=%%c
)
If "%dd%"=="" echo schit happens
gruß
Uuuuuuuuupps, T-Mo,
sorry,du hast vollkommen Recht....
Ich sollte mir abgewöhnen, geleichzeitig zu telefonieren und zu tippseln.
Okay, jetzt bin ich zwar fertig mit Telefonieren - aber ichweiss wieder mal nicht, wo ich mein Tipp-Ex hingelegt habe.
Sonst würde meinen Kommentar oben etwas editieren.
Okay - ich mach mal einfach nach dem "-->Kein guter Plan" weiter, als wäre nix gewesen....
--> Kein guter Plan.
Erstens wird er die "C:\BACKUP\license.logg" mit zwei "g" am Ende nicht finden und rumwinseln
Zweitens haben dann immer die License.logs das Datum/meinetwegen die Uhrzeit des Sicherns. Nicht aber ihr eigenes.
Das heißt auch hier (wie oben ausgeführt)--> u.U. sicherst du 200x dieselbe License.log-Datei.
Aber das steigert den Nutz- oder Brennwert ja nicht automatisch um das 200fache.
--> Ich würde das Datei-Datum der Logdatei anhängen und diese Datei dann sichern, wenn es genau diesen Stand/diesen Dateinamen noch nicht gibt.
Grüße
Biber
sorry,du hast vollkommen Recht....
Ich sollte mir abgewöhnen, geleichzeitig zu telefonieren und zu tippseln.
Okay, jetzt bin ich zwar fertig mit Telefonieren - aber ichweiss wieder mal nicht, wo ich mein Tipp-Ex hingelegt habe.
Sonst würde meinen Kommentar oben etwas editieren.
Okay - ich mach mal einfach nach dem "-->Kein guter Plan" weiter, als wäre nix gewesen....
...
xcopy C:\Prgal\license.log C:\BACKUP\license.log
ren C:\BACKUP\license.logg license.log%%hh%%-%%mi%%
Erstens wird er die "C:\BACKUP\license.logg" mit zwei "g" am Ende nicht finden und rumwinseln
Zweitens haben dann immer die License.logs das Datum/meinetwegen die Uhrzeit des Sicherns. Nicht aber ihr eigenes.
Das heißt auch hier (wie oben ausgeführt)--> u.U. sicherst du 200x dieselbe License.log-Datei.
Aber das steigert den Nutz- oder Brennwert ja nicht automatisch um das 200fache.
--> Ich würde das Datei-Datum der Logdatei anhängen und diese Datei dann sichern, wenn es genau diesen Stand/diesen Dateinamen noch nicht gibt.
Grüße
Biber

Zitat von @Biber:
Uuuuuuuuupps, T-Mo,
sorry,du hast vollkommen Recht....
Ich sollte mir abgewöhnen, geleichzeitig zu telefonieren und zu tippseln.
Wieso, fängt doch beides mit T an Uuuuuuuuupps, T-Mo,
sorry,du hast vollkommen Recht....
Ich sollte mir abgewöhnen, geleichzeitig zu telefonieren und zu tippseln.
Okay, jetzt bin ich zwar fertig mit Telefonieren - aber ich weiss wieder mal nicht, wo ich mein Tipp-Ex hingelegt habe.
Auf meinem Monitor...Sonst würde meinen Kommentar oben etwas editieren.
Erstens wird er die "C:\BACKUP\license.logg" mit zwei "g" am Ende nicht finden und rumwinseln
Zweitens haben dann immer die License.logs das Datum/meinetwegen die Uhrzeit des Sicherns. Nicht aber ihr eigenes.
Erstens wird er die "C:\BACKUP\license.logg" mit zwei "g" am Ende nicht finden und rumwinseln
Zweitens haben dann immer die License.logs das Datum/meinetwegen die Uhrzeit des Sicherns. Nicht aber ihr eigenes.
for /f "tokens=1-3 delims=. " %%a in ('dir C:\BACKUP\license.log^|findstr "log"') do (
if not exist C:\BACKUP\license-%%a-%%b-%%c.log copy C:\Prgal\license.log C:\BACKUP\license-%%a-%%b-%%c.log
)
--> Ich würde das Datei-Datum der Logdatei anhängen und diese Datei dann sichern, wenn es genau diesen Stand/diesen Dateinamen noch nicht gibt.
und warum "machste das nicht? -schonwiederdieohrenamhörer -duck-flitz
Grüße
Biber

Salü,
ich weiss - ich bin pingelig...
Im Prinzip würde ich auf jedem der Server den Ordner, wo sich das log aufhält eine Freigabe einrichten.
Am liebsten mit nem $ dahinter, dann tauchts bei den klickibuntinetzwerkdurchsuchenden Usern nicht auf.
pi mal daumen ungetestet und aus dem Bauch raus. ganz sicher mit verbesserungspotential.
Gruß
ich weiss - ich bin pingelig...
Ich habe Windows Services die auf einem Server laufen.
passt doch nicht zu den drei sc Befehlen....Im Prinzip würde ich auf jedem der Server den Ordner, wo sich das log aufhält eine Freigabe einrichten.
Am liebsten mit nem $ dahinter, dann tauchts bei den klickibuntinetzwerkdurchsuchenden Usern nicht auf.
echo Windows Services:
dir C:\flexlm\ /b /AD
SET /p service=Bitte geben Sie den Service ein den Sie starten wollen:
dir C:\flexlm\ /S /AD |find /i "%service%"&& goto start
goto error
::backup
for /f "tokens=1-3 delims=. " %%a in ('dir \\%1\c$\backup\license.log^|findstr "log"') do (
if not exist %1\c$\backup\license-%%a-%%b-%%c.log copy %1\c$\Prgal\license.log %1\c$\backup\license-%%a-%%b-%%c.log
)
goto :eof
:start
call :backup server01
sc \\server01 start "%service%"
call :backup server02
sc \\server02 start "%service%"
call :backup server03
sc \\server03 start "%service%"
goto end
:error
:end
Gruß
Moin winlin,
wenn du zu dem Tagesdatum noch die Uhrzeit ergänzen willst ist es nicht soo schwierig.
Am besten, du testest es mal trocken am CMD-Prompt.
Momentan nimmst du ja jetzt eine (die relevante) Zeile aus einer normalen DIR-Ausgabe, die meinetwegen so aussieht
-> Bisher zerlegst du diese Zeile mit einer FOR/F-Anweisung mit "tokens=1-3 delims=. ".
Also im ganzen Satz:
ich will die Zeile zerbröseln an den Trennzeichen Punkt und Leerzeichen und will die Brösel 1 (=Tag) ,2 (=Monat) und 3 (=Jahr) .
Was du jetzt als nächstes machen willst ist:
ich will die Zeile zerbröseln an den Trennzeichen Punkt und Doppelpunkt und Leerzeichen und will die Brösel 1, 2, 3 (=Tag. Monat, jahr wie oben) ,4 (=Stunde) und 5 (=sagichnich).
Simulation am CMD-Prompt (erste Zeile:ist die eingegebene; ">" NICHT mit eingeben; ist mein Prompt)
Der Text in der FOR/F-IN-Klammer entspricht meinen (zufällig eingestellten) DIR-Ausgabeformaten.
Kann bei dir etwas aussehen... aber genau deshalb solltest du ja trocken üben.
Grüße
Biber
wenn du zu dem Tagesdatum noch die Uhrzeit ergänzen willst ist es nicht soo schwierig.
Am besten, du testest es mal trocken am CMD-Prompt.
Momentan nimmst du ja jetzt eine (die relevante) Zeile aus einer normalen DIR-Ausgabe, die meinetwegen so aussieht
...{ hier sagtest du "Dir \\server\share\XY\license.log, unten kommt unter anderem dann so eine Zeile:}
08.08.10 18:34 2.147 license.log
Also im ganzen Satz:
ich will die Zeile zerbröseln an den Trennzeichen Punkt und Leerzeichen und will die Brösel 1 (=Tag) ,2 (=Monat) und 3 (=Jahr) .
Was du jetzt als nächstes machen willst ist:
ich will die Zeile zerbröseln an den Trennzeichen Punkt und Doppelpunkt und Leerzeichen und will die Brösel 1, 2, 3 (=Tag. Monat, jahr wie oben) ,4 (=Stunde) und 5 (=sagichnich).
Simulation am CMD-Prompt (erste Zeile:ist die eingegebene; ">" NICHT mit eingeben; ist mein Prompt)
>for /f "tokens=1-5 delims=.: " %a in ("08.04.10 18:34 47 license.log") do @echo license%a-%b-%c_%d%e.log
license08-04-10_1834.log
Der Text in der FOR/F-IN-Klammer entspricht meinen (zufällig eingestellten) DIR-Ausgabeformaten.
Kann bei dir etwas aussehen... aber genau deshalb solltest du ja trocken üben.
Grüße
Biber

Moin,
du nutzt in einer Schleife eine Variable - und da ist Batch einfach dümmer als Brot.
Schau mal nach (sicherlich von Biber nett aufbereiteten) Tipps zu EnableDelayedExpansion - das erklärt hier jedenWocheMonat einer 
Gruß
du nutzt in einer Schleife eine Variable - und da ist Batch einfach dümmer als Brot.
Schau mal nach (sicherlich von Biber nett aufbereiteten) Tipps zu EnableDelayedExpansion - das erklärt hier jeden
Gruß
Moin winlin,
naja, geht doch voran bei dir..
Ein paar Anmerkungen:
Denn selbst, wenn ich dir hier eine handwerkliche Lösung zeigen würd, wie du einen Doppelpunkt in einen Dateinamen bekommst... Hey, für deine ästhetischen Empfingen mag es zwar dann wohlgefällig aussehen.
Aber ziemlich alle Utilities angefangen vom Windows-Explorer bis zum USB-Stick-Treiber oder bis zum CD-Brenner werden demonstrativ in einen unbefristeten Streik treten, wenn du die damit loslaufen lässt. Wenn du "0809" nicht als interpretierbare Uhrzeitangabe empfindest->"08h09".
Die ersten beiden bekommst du mit "tokens=1-5"-Minik aus der DIR-Ausgabe.
Beim DIR kannst du dir noch wünschen, ob Erstellungs oder Änderungszeit (siehe DIR /?; Parameter /tc und /tm )-
Die aktuelle Ortszeit deines Rechners steht in der Variablen %time%. Einfach mal "echo %time%" am Cmd-Prompt eingeben, dann siehst du das Format.
Grüße
Biber
naja, geht doch voran bei dir..
Ein paar Anmerkungen:
Es sollte noch ein : dazwischen
Nein. Das willst du nicht wirklich. Glaub mir.Denn selbst, wenn ich dir hier eine handwerkliche Lösung zeigen würd, wie du einen Doppelpunkt in einen Dateinamen bekommst... Hey, für deine ästhetischen Empfingen mag es zwar dann wohlgefällig aussehen.
Aber ziemlich alle Utilities angefangen vom Windows-Explorer bis zum USB-Stick-Treiber oder bis zum CD-Brenner werden demonstrativ in einen unbefristeten Streik treten, wenn du die damit loslaufen lässt. Wenn du "0809" nicht als interpretierbare Uhrzeitangabe empfindest->"08h09".
Datei-Erstellungszeit <->Datei-Änderungszeit<-> Uhrzeit des Skriptlaufs.
Ist natürlich deine Entscheidung, welche Zeit du verwertest - ich habe oben schon geschrieben, welche ich nehmen würde.Die ersten beiden bekommst du mit "tokens=1-5"-Minik aus der DIR-Ausgabe.
Beim DIR kannst du dir noch wünschen, ob Erstellungs oder Änderungszeit (siehe DIR /?; Parameter /tc und /tm )-
Die aktuelle Ortszeit deines Rechners steht in der Variablen %time%. Einfach mal "echo %time%" am Cmd-Prompt eingeben, dann siehst du das Format.
Grüße
Biber

moin,
was ganz andreasssesss..
Springe zu dem Block, der bei Zeile 7 beginnt und gib dem Block als den ersten und einzigen Parameter "Server01"
mit deiner Variante, wo du den variablen Springblock einem - den ersten Server vorgibst.
Ergo deine Zeile 16 mit dem Aufruf
gar nicht ausgewertet - sprich beim ersten klappert das zwar einigermassen - bei Server x y und z aber nur per Zufall.
Gruß
was ganz andreasssesss..
- schau dir mal meine Zeile 14 an...
14. call :backup server01
das bedeutet im klartext zwischen Tür & AngelSpringe zu dem Block, der bei Zeile 7 beginnt und gib dem Block als den ersten und einzigen Parameter "Server01"
08. for /f "tokens=1-3 delims=. " %%a in ('dir \\%1\c$\backup\license.log
...der auch via %1 angenommen wird...mit deiner Variante, wo du den variablen Springblock einem - den ersten Server vorgibst.
Ergo deine Zeile 16 mit dem Aufruf
call :backup server01
wird in deiner Zeile 11if not exist \\server01\
gar nicht ausgewertet - sprich beim ersten klappert das zwar einigermassen - bei Server x y und z aber nur per Zufall.
Gruß
Moin winlin,
ich habe es neulich schon in einem anderen Beitrag geschrieben...
-> der Grundgedanke von "Batch" ist eigentlich, dass du einen Schritt nach dem anderen machst.
Nicht alles durcheinander.
Im Moment gehst du mir da ein bisschen zu hektisch ran -> und dabei kannst du leicht mit dem Popo alles umreissen, was du mit den Händen aufgebaut hast.
Dehalb beschränke ich mich auf EIN Detail, nachdem du gefragt hast:
Ich meinte vorhin mit
[[Dafür gibt es keinen Grund-->aber wenn du es tust, sind es Befehlsaufrufe und müssen in der FOR-Anweisungsklammer in einfache Anführungszeichen.]]
Wenn du die Variablen %date% und/oder %time% als Text auswertest, dann müssen die Variablen in der FOR-Anweisungsklammer in DOPPELTE Anführungszeichen
Dein Aufruf ist aber im Moment so:
Und nein, ich kaspere das jetzt nicht vor.
Bitte mach deinen ganz eigenen proof-of-concept am CMD-Prompt und zerlege dort %date% und %time% mit einer FOR/F-Anweisung.
Und ned huddele.... wie wir Bremer sagen. Nicht hektisch werden.
Grüße
Biber
ich habe es neulich schon in einem anderen Beitrag geschrieben...
-> der Grundgedanke von "Batch" ist eigentlich, dass du einen Schritt nach dem anderen machst.
Nicht alles durcheinander.
Im Moment gehst du mir da ein bisschen zu hektisch ran -> und dabei kannst du leicht mit dem Popo alles umreissen, was du mit den Händen aufgebaut hast.
Dehalb beschränke ich mich auf EIN Detail, nachdem du gefragt hast:
Ich meinte vorhin mit
"Die aktuelle Ortszeit deines Rechners steht in der Variablen %time%. Einfach mal "echo %time%" am Cmd-Prompt eingeben, dann siehst du das Format."
dass du NICHT den Umweg über den Aufruf von "date/t" und "time/t"-Befehlen gehen musst.[[Dafür gibt es keinen Grund-->aber wenn du es tust, sind es Befehlsaufrufe und müssen in der FOR-Anweisungsklammer in einfache Anführungszeichen.]]
Wenn du die Variablen %date% und/oder %time% als Text auswertest, dann müssen die Variablen in der FOR-Anweisungsklammer in DOPPELTE Anführungszeichen
Dein Aufruf ist aber im Moment so:
for /f "tokens=4-6 delims=: " %%a in (time /t) do ...
--> das entspricht KEINER der beiden Syntaxvarianten.Und nein, ich kaspere das jetzt nicht vor.
Bitte mach deinen ganz eigenen proof-of-concept am CMD-Prompt und zerlege dort %date% und %time% mit einer FOR/F-Anweisung.
Und ned huddele.... wie wir Bremer sagen. Nicht hektisch werden.
Grüße
Biber