supersonic
Goto Top

Robocopy Backupscript Datumsauswertung

Problem mit der Datumsauswertung.

Ich bräuchte mal eine kleine hilfe, irgendwie stehe ich gerade auf dem Schlauch.
Mein Backupscript wertet das Datum aus dieses wird dann in die Variable WoTa reinschrieben.

Wenn ich diese Variable ausgebe, sagt er mir auch das heute Donnerstag ist.

Allerdings unten in meiner IF Abfrage... verwendet er immer den Montag und nicht den Donnerstag, somit wird mein Backupverzeichnis ins Verzeichnis Montag kopiert.
Ich komm im moment nicht auf den Fehler.

@Echo off & setlocal 

FOR /F "tokens=1,2,3 delims=." %%a in ('echo %date%') do set yy=%%c & set mm=%%b & set dd=%%a   

set /a "TwoDigitYearMax=2038%%1000"   

if 1%yy% LSS 200 if 1%yy% LSS 1%TwoDigitYearMax% (set yy=20%yy%) else (set yy=19%yy%) 

set /a dd=100%dd%%%100,mm=100%mm%%%100 
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2 
set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1 

If %dow% equ 1 set "WoTa=Montag"   
If %dow% equ 2 set "WoTa=Dienstag"   
If %dow% equ 3 set "WoTa=Mittwoch"   
If %dow% equ 4 set "WoTa=Donnerstag"   
If %dow% equ 5 set "WoTa=Freitag"   
If %dow% equ 6 set "WoTa=Samstag"   
If %dow% equ 7 set "WoTa=Sonntag"  



SET RC_path="C:\WINDOWS\System32\ROBOCOPY.EXE"   
SET Quelle="C:\Users\test\Downloads"   


SET bck_Mo="C:\Montag_Freitag\Montag"   
SET bck_Di="C:\Montag_Freitag\Dienstag"   
SET bck_Mi="C:\Montag_Freitag\Mittwoch"   
SET bck_Do="C:\Montag_Freitag\Donnerstag"   
SET bck_Fr="C:\Montag_Freitag\Freitag"  


SET Log_dir="C:\test\Backups\Robocopy\"   
SET Log_filename=%Log_dir%%WoTa%_%JJ%_%MM%_%TT%.log 
SET Copy_MoFr=/MIR /COPYALL /DCOPY:T /A 
SET Copy_Fr=/MIR /COPYALL 
REM SET Optionen=/R:0 /W:0 /NP / TEE /LOG+:%Log_filename% 


if %WoTa%==Montag goto Montag
:Montag
Echo J|del c:\Montag_Freitag\Montag\*.*
%RC_path% %Quelle% %bck_Mo% %Copy_MoFr% 


if %WoTa%==Dienstag goto Dienstag
:Dienstag
Echo J|del c:\Montag_Freitag\Dienstag\*.*
%RC_path% %Quelle% %bck_Di% %Copy_MoFr%  


if %WoTa%==Mittwoch goto Mittwoch
:Mittwoch
Echo J|del C:\Montag_Freitag\Mittwoch\*.*
%RC_path%%Quelle% %bck_Mi% %Copy_MoFr% 


if %WoTa%==Donnerstag goto Donnerstag
:Donnerstag
Echo J|del C:\Montag_Freitag\Donnerstag\*.*
%RC_path%%Quelle% %bck_Do% %Copy_MoFr% 


if %WoTa%==Freitag goto Freitag 
:Freitag
Echo J|del C:\Montag_Freitag\Freitag\*.*
%RC_path%%Quelle% %bck_Do% %Copy_MoFr% 

:END 

Das Script ist noch im Aufbau, also haut mich nicht face-smile

Danke schonmal...
Kommentar vom Moderator Biber am Nov 29, 2011 um 18:31:55 Uhr
Verschoben von "Backup" nach "Bätsch".

Content-Key: 176772

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: Skyemugen
Skyemugen Nov 24, 2011, updated at Oct 18, 2012 at 16:49:11 (UTC)
Goto Top
Aloha,

  1. Dein Problem sind die aufeinanderfolgenden Sprungmarken mit halbfertigen if-Abfragen, wenn ich das Datum am Rechner ändere, sodass ein anderer WoTa ensteht, gibt er mir per echo %WoTa% auch den korrekten Wochentag aus.
.......Da deine if-Abfragen kein else beinhalten ... springen die trotzdem in den Tag, sprich if %WoTa% nicht Montag, geht er einfach weiter und arbeitet dennoch :Montag ab (und die ganze Reihe runter)
  1. Was machst du nächstes Jahr? => Schaltjahr
  2. Batch und Datum ... na egal,

wenn du schon das Skript aus diesem Thread nimmst und mit robocopy arbeitest, warum nutzt du dann nicht das zweite Skript von Biber, was simpler und sicherer ist?

Sicherer wäre es dann wohl auch, wenn du deine if-Abfragen einfach weglässt und nur goto %WoTa% nutzt face-wink und am Ende jeweiliger Sprungmarke ein goto :eof einfügst (und damit das Skript beendest)

greetz André

P.S.: Wir mögen hier eigentlich, dass man uns vorher begrüßt, bevor man uns auf sein Problem loslässt ...
Member: SuperSonic
SuperSonic Nov 24, 2011 at 12:43:25 (UTC)
Goto Top
Danke erstmal für deine Antwort.

Nachdem ich noch ein paar Minuten drüber nach gedacht habe... kam die sache auch mit dem IF ELSE... allerdings wenn das nette Ding so verschachtel...
funktioniert die Sache auch nicht... wahrscheinlich stelle ich mich etwas zu blöde an.

if %WoTa%=="Montag" goto Montag (  
:Montag
Echo J|del c:\Montag_Freitag\Montag\*.*
%RC_path% %Quelle% %bck_Mo% %Copy_MoFr% 
 ) ELSE 
   if  %WoTa%=="Dienstag" goto Dienstag (  
   :Dienstag
   Echo J|del c:\Montag_Freitag\Dienstag\*.*
   %RC_path% %Quelle% %bck_Di% %Copy_MoFr%  
   ) ELSE 
     if %WoTa%=="Mittwoch" goto Mittwoch (  
     :Mittwoch
     Echo J|del C:\Montag_Freitag\Mittwoch\*.*
     %RC_path%%Quelle% %bck_Mi% %Copy_MoFr% 
     ) ELSE
	   if %WoTa%=="Donnerstag" goto Donnerstag (  
	   :Donnerstag
	   Echo J|del C:\Montag_Freitag\Donnerstag\*.*
	   %RC_path%%Quelle% %bck_Do% %Copy_MoFr% 
		 ) Else 
           if %WoTa%=="Freitag" goto Freitag   
           :Freitag
		   Echo J|del C:\Montag_Freitag\Freitag\*.*
		   %RC_path%%Quelle% %bck_Do% %Copy_MoFr% 

Was deine andere Punkte angeht, da werd ich mir sicherlich nochmal Gedanken drüber machen...
Sollte jetzt erstmal nur ein Testlauf mit dem Script sein...
Member: Skyemugen
Skyemugen Nov 24, 2011 at 12:48:48 (UTC)
Goto Top
Sicherer wäre es dann wohl auch, wenn du deine if-Abfragen einfach weglässt und nur goto %WoTa% nutzt face-wink und am Ende jeweiliger Sprungmarke ein goto :eof einfügst (und damit das Skript beendest)

wobei ... nutze %WoTa% doch einfach im Pfad ...
Echo J|del c:\Montag_Freitag\%WoTa%\*.* 
%RC_path% %Quelle% "C:\Montag_Freitag\%WoTa%" %Copy_MoFr%  

btw:
%RC_path%%Quelle% %bck_Do% %Copy_MoFr%
Und das steht auch bei Freitag ...

und wo verwendest du eigentlich %Copy_Fr%?
Member: SuperSonic
SuperSonic Nov 24, 2011 at 19:19:35 (UTC)
Goto Top
Also, irgendwie funktioniert das alles so nicht wie ich will... auch wenn ich das Umstelle... jetzt bin ich echt Verzweifel face-sad
Member: Skyemugen
Skyemugen Nov 24, 2011 at 19:40:43 (UTC)
Goto Top
... naja sei froh, dass T-Mo nicht vorbeiguckt und dir dein €echo off über den Schädel zieht ^__^
Member: Biber
Biber Nov 29, 2011 at 18:30:40 (UTC)
Goto Top
Moin SuperSonic,

Zitat von @SuperSonic:
Also, irgendwie funktioniert das alles so nicht wie ich will... auch wenn ich das Umstelle... jetzt bin ich echt Verzweifel face-sad

Falls denn das Problem noch besteht, dann poste doch bitte mal den jetzigen Schnipsel-Entwurf.

Dann ziehen wir das glatt.

Ich verschiebe den Beitrag schon mal von "ich hätte lieber Bäckupper werden sollen" nach "Bäck in Hell".

Grüße
Biber

P.S. Und keine Angst - niemand wird T-Mo holen... face-wink
Member: SuperSonic
SuperSonic Nov 29, 2011 at 20:11:32 (UTC)
Goto Top
hallo, biber...

ich versuch das ganze Ding jetzt in VBS zuschreiben. Hab allerdings nicht so viel Erfahrung in VBS.

Bis jetzt sieht der Code so aus:

Dim Heute

Heute = Date()

If Weekday(Heute) = vbSunday Then 
If Weekday(Heute) = vbMonday Then
If Weekday(Heute) = vbTuesday Then
If Weekday(Heute) = vbWednesday Then
If Weekday(Heute) = vbThursday Then
If Weekday(Heute) = vbFriday Then 
If Weekday(Heute) = vbSaturday Then

Sub Sunday()
WScript.Echo("Heute kein Backup")  
END Sub


Wollte dann für jeden Tag eine Prozedur schreiben, allerdings ist mir noch nicht so ganz klar, wie ich, oben bei If Weekday(Heute) =vbSunday Then <Prozeduraufruf> reinschreibe.

wäre das so realisierbar, oder bin ich wieder auf dem falschen Weg face-smile ?!
Member: Biber
Biber Nov 30, 2011 at 14:22:08 (UTC)
Goto Top
Moin SuperSonic,

langsam, langsam.....

Es bringt für das konkrete Anliegen ja nichts, wenn du da eine VBSkript-Hülse drumstrickst statt ein Batch-Mäntelchen.

Was doch eigentlich passieren soll, wenn wir mal die Schörkel weglassen:
Am Ende des Tages soll eine RabottiCopy.exe gestartet werden. Fertig.

Ob ich dat Dingen aus einem Batch oder aus VBS heraus aufrufe....
... ich sach mal so: auch zum Öffnen meines sonntäglichen Frühstückeis stehen mir Werkzeuge vom Plastiklöffel bis zum Gabelstapler zur Verfügung.
Ich würde es aber nicht zu aufwendig angehen.

Das Problem in deiner Batchvariante ist doch nicht die Ermittlung des Wochentages - den bekommst du doch irgendwie.
Das Problem ist, dass du beim Auffächern der 7-Wochentage-7-Möglichkeiten offensichtlich nicht alle 7 Varianten gleichzeitig im Auge behalten kannst und dir immer ein oder zwei davon auf die Füsse fallen.

Also entzerre doch dieses Gestrunkele:
...
REM irgendwie irgendwo kommt der Zahlenwert %dow% her...

If %dow% equ 1 set "WoTa=Montag"   
If %dow% equ 2 set "WoTa=Dienstag"   
If %dow% equ 3 set "WoTa=Mittwoch"   
If %dow% equ 4 set "WoTa=Donnerstag"   
If %dow% equ 5 set "WoTa=Freitag"   
If %dow% equ 6 set "WoTa=Samstag"   
If %dow% equ 7 set "WoTa=Sonntag"  



SET RC_path="C:\WINDOWS\System32\ROBOCOPY.EXE"   
SET Quelle="C:\Users\test\Downloads"   


SET bck_Mo="C:\Montag_Freitag\Montag"   
SET bck_Di="C:\Montag_Freitag\Dienstag"   
SET bck_Mi="C:\Montag_Freitag\Mittwoch"   
SET bck_Do="C:\Montag_Freitag\Donnerstag"   
SET bck_Fr="C:\Montag_Freitag\Freitag"  


SET Log_dir="C:\test\Backups\Robocopy\"   
SET Log_filename=%Log_dir%%WoTa%_%JJ%_%MM%_%TT%.log 
SET Copy_MoFr=/MIR /COPYALL /DCOPY:T /A 
SET Copy_Fr=/MIR /COPYALL 
REM SET Optionen=/R:0 /W:0 /NP / TEE /LOG+:%Log_filename% 


if %WoTa%==Montag goto Montag
:Montag
Echo J|del c:\Montag_Freitag\Montag\*.*
%RC_path% %Quelle% %bck_Mo% %Copy_MoFr% 


if %WoTa%==Dienstag goto Dienstag
:Dienstag
Echo J|del c:\Montag_Freitag\Dienstag\*.*
%RC_path% %Quelle% %bck_Di% %Copy_MoFr%  
.....
....

---> analog zu Skyes Vorschlag...

...
If %dow% equ 6 goto :eof  && REM kein Backup, Ende
If %dow% equ 7 goto :eof  && REM kein Backup, Ende

If %dow% equ 1 set "WoTa=Montag"   
If %dow% equ 2 set "WoTa=Dienstag"   
If %dow% equ 3 set "WoTa=Mittwoch"   
If %dow% equ 4 set "WoTa=Donnerstag"   
If %dow% equ 5 set "WoTa=Freitag"   



SET RC_path="C:\WINDOWS\System32\ROBOCOPY.EXE"   
SET Quelle="C:\Users\test\Downloads"   

SET Log_dir="C:\test\Backups\Robocopy\"   
SET Log_filename=%Log_dir%%WoTa%_%JJ%_%MM%_%TT%.log 
SET Copy_MoFr=/MIR /COPYALL /DCOPY:T /A 
SET Copy_Fr=/MIR /COPYALL 
REM SET Optionen=/R:0 /W:0 /NP / TEE /LOG+:%Log_filename% 

del c:\Montag_Freitag\%WoTa%\*.* /y
%RC_path% %Quelle% c:\Montag_Freitag\%WoTa%\  %Copy_MoFr% 

REM das wars.


Grüße
Biber
Member: Skyemugen
Skyemugen Nov 30, 2011 at 14:27:18 (UTC)
Goto Top
Aloha Biber,

naja nur dass ich auch meinte - sinnvollerweise Zeile 32 als

%RC_path% %Quelle% "C:\Montag_Freitag\%WoTa%" %Copy_MoFr%  
zu nutzen, denn so benötigt er wirklich nur noch eine Zeile, denn deine eine ist nur für Montag gültig face-wink und so spart man sich auch weitere 5 Zeilen im Skript *gg*

greetz André
Member: Biber
Biber Nov 30, 2011 at 14:39:48 (UTC)
Goto Top
Upps, Skye,

hatte ich auch grad beim Korrekturlesen meines Beitrags gemerkt und korrigiert - wahrscheinlich während du (zu Recht) deinen Kommentar getippselt hast.

Ist bei mir oben auch korrigiert mitterweile.

Danke & Grüße
Biber
Member: SuperSonic
SuperSonic Nov 30, 2011 at 15:38:42 (UTC)
Goto Top
If %dow% equ 6 goto :eof  && REM kein Backup, Ende
If %dow% equ 7 goto :eof  && REM kein Backup, Ende

If %dow% equ 1 set "WoTa=Montag"   
If %dow% equ 2 set "WoTa=Dienstag"   
If %dow% equ 3 set "WoTa=Mittwoch"   
If %dow% equ 4 set "WoTa=Donnerstag"   
If %dow% equ 5 set "WoTa=Freitag"   



SET RC_path="C:\WINDOWS\System32\ROBOCOPY.EXE"   
SET Quelle="C:\Users\test\Downloads"   

SET Log_dir="C:\test\Backups\Robocopy\"   
SET Log_filename=%Log_dir%%WoTa%_%JJ%_%MM%_%TT%.log 
SET Copy_MoFr=/MIR /COPYALL /DCOPY:T /A 
SET Copy_Fr=/MIR /COPYALL 
REM SET Optionen=/R:0 /W:0 /NP / TEE /LOG+:%Log_filename% 

del c:\Montag_Freitag\%WoTa%\*.* /y
%RC_path% %Quelle% c:\Montag_Freitag\%WoTa%\  %Copy_MoFr% 

Hmm, also irgendwie bin ich etwas verwirrt.
Du hast natürlich jetzt noch eine Selektierung für Samstag und Sonntag gemacht, das da kein Backup statt findet. Soweit so klar.
jetzt nimmst du die Variable WoTa und setzt sie praktisch unten in die Robocopy commandline somit wird gleich der Aktuelle Wochentag verwendet und ich muss mich nicht mehr mit meinem IF-Schleifen rumqäulen?
Member: Skyemugen
Skyemugen Nov 30, 2011, updated at Oct 18, 2012 at 16:49:15 (UTC)
Goto Top
... genau das habe ich dir bereits mehrfach geschrieben mit samt Codebox wie du in diesem Beitrag hättest lesen müssen ...

ist doch eigentlich nicht so schwer zu verstehen ... genau dazu hat man doch Variablen
Member: Biber
Biber Nov 30, 2011 at 16:01:38 (UTC)
Goto Top
Moin SuperSonic,

Zitat von @SuperSonic:
... jetzt nimmst du die Variable WoTa und setzt sie praktisch unten in die Robocopy commandline somit wird gleich der Aktuelle
Wochentag verwendet und ich muss mich nicht mehr mit meinem IF-Schleifen rumqäulen?

Genau das war das Wesentliche.

Skye hat es handwerklich noch etwas sauberer/sicherer gemacht in seiner Zeile
%RC_path% %Quelle% "C:\Montag_Freitag\%WoTa%" %Copy_MoFr%
durch die umschliessenden Anführungszeichen rund um das Kopierziel.
Ebenso sollte auch der Parameter %Quelle% in Anführungszeichen geschrieben werden wegen eventueller Leerzeichen im Pfadnamen.
Das ist aber alles vergleichsweise kosmetisch - wesentlich war das Lernziel
"Sieben mögliche Usecases bedeuten nicht zwangsläufig sieben einzelne Sub-Prozeduren.
Wenn denn 5 Fälle (Mo-Fr) gleich zu behandeln sind und zwei andere Wochentage auch gleich (Sa+So), dann brauche ich keine 7 Variationen, sondern zwei."


Falls du dich unbedingt in IF -Verzweigungen üben willst -- ein IF-Fall wäre ja noch abzubilden.
Die Freitagssicherung ist ja - zumindest in deinem Eröffnungsbeitrag - eine Sonderlocke -> dafür fehlt noch ein IF-Konstrukt.

Grüße
Biber
Member: Skyemugen
Skyemugen Nov 30, 2011 at 16:09:45 (UTC)
Goto Top
Zitat von @Biber:
Die Freitagssicherung ist ja - zumindest in deinem Eröffnungsbeitrag - eine Sonderlocke -> dafür fehlt noch ein IF-Konstrukt.

Aloha Biber,

ich hielt das eher für einen Fauxpas TEseits face-wink Ich bezweifle, dass er zweimal Donnerstag kopieren will face-wink er macht lieber neue Threads auf *fg*

greetz André
Mitglied: 60730
60730 Nov 30, 2011 at 16:28:55 (UTC)
Goto Top
moin,

Zitat von @Biber:
P.S. Und keine Angst - niemand wird T-Mo holen... face-wink

[OT]
Meinst du - sobald du das zu den anderen nach "Bätsch" verschiebst - kommt der von alleine?
Bin ich schon so vorhersehbar?
[/OT]

[1/2 OT]
André hats ja schon bemerkt, aber
set /a "TwoDigitYearMax=2038%%1000"
liefert bei mir schon ein € ins Sparschwein. Und man heute wirklich noch eine Batch bauen soll, die eventuell das aktuelle datum mit einer 19xx voranstellt?
[/1/2 OT]


Ich würd mir den ganzen Schmodder sparen, eine Hauptbatch (etwas mehr als einen 3Zeiler) zimmern, jeden Tag einen eigenen Schedjob anlegen, der gleich als Parameter Montaach;Dienstaach usw. mitliefert und den via %1 auswertet..

Ist aber wahrscheinlich viel zu einfach face-wink

Gruß
Member: SuperSonic
SuperSonic Nov 30, 2011 at 16:31:47 (UTC)
Goto Top
Sorry, ich weiss jetzt was du meinst, ich war wohl etwas geblendet, von meiner tollen Lösung face-smile
Member: SuperSonic
SuperSonic Nov 30, 2011 at 16:32:34 (UTC)
Goto Top
Stimmt, freitag wollte ich ein Vollbackup machen... da kann ich ne IF-abfrage reinknallen.
Member: SuperSonic
SuperSonic Nov 30, 2011 at 16:33:34 (UTC)
Goto Top
hmmm, ok.. so würd ich es unter Linux machen, aber net unter Windows face-smile
Mitglied: 60730
60730 Nov 30, 2011 at 17:10:50 (UTC)
Goto Top
Zitat von @SuperSonic:
hmmm, ok.. so würd ich es unter Linux machen, aber net unter Windows face-smile

grübel....

Also ausgerechnet unter Tux wo das mit dem Wochentag Schnickschnack ist?

BTW unter Tux heißt .net mono und weder das eine noch das andere braucht man für das problemchen.

Schade, dass du nicht auf die anderen Zeilen eingehst, Da Leg ich mich wieder hin.
Member: Biber
Biber Nov 30, 2011 at 17:22:44 (UTC)
Goto Top
Zitat von @SuperSonic:
hmmm, ok.. so würd ich es unter Linux machen, aber net unter Windows face-smile

Na ja,

T-Mos Jeden-Tag-einen-eigenen-Schedjob-anlegen-Lösung, kombiniert mit meinen Ausführungen bzgl "es gibt eigentlich nur 2 Usecases" führt doch zu den Schluss:

  • wenn du einen Scheduler-Job anlegst für Montag bis Donnerstag (der den Wochentag ermitteln muss)
  • und einen Scheduler-Job anlegst für Freitag, der nur Freitags startet und deshalb automatisch den Wochentag "Freitag" weiss
  • und definitiv keinen Job anlegst, der Samstag und Sonntag läuft...

--> dann hast du doch dein 7-Wochentagsproblem auf zwei Fälle reduziert.
Du hast eine einzige Sourcecodestelle, in der du gegebenfalls den Wochentagermittlungsalgorithmus anpassen musst
( wegen unerwartet auftretendem Schaltjahr oder weil wir zur Euro-Rettung einen Wochentag mehr bekommen oder ähnlichem.)
--> die Pfleg- und Wartbarkeit ist gegeben.

Und du hast als zweites einen strunzdoofen Freitagsjob, dem du jedesmal als festen Parameter mitgibst, welcher Tag nun ist.

Ist doch um Welten besser als deine sieben IF-Jonglierbälle gleichzeitig in der Luft.

Grüße
Biber