38520
Goto Top

bitte um Unterstützung bei meiner Batch Sicherung

möchte eine Sicherung auf verschieden mobile Festplatten ausführen mit erstellung von täglichen Ordnern

Hallo Liebe Gemeinde ich brauche mal euere Unterstützung !!!
Also mein Probleem ist ich sicher per Batch eine Partition auf eine mobile Festplatte diese wird durch die exist.TxT erkannt
dann werden die daten mittels Xcopy befehl copiert.
bie dahin funktioniert das ganze jetzt möchte ich für jeden Wochentag ein neues Unterverzeichniss also
F:\Montag\......
F:\dienstag\....
Und einmal in Monat eine Sicherung die nicht Überschrieben wird also in etwa
F:\januar\....
Das ganze sollte möglichst ohne manuelle Eingabe fünktionieren.

mein bis jetzt verwendetes batch sieht so aus.

@echo off
if exist G:\exist.txt goto start3
if exist H:\exist.txt goto start4
if exist I:\exist.txt goto start5
if exist J:\exist.txt goto start6
if exist K:\exist.txt goto start7
if exist L:\exist.txt goto start8
if exist M:\exist.txt goto start9
if exist N:\exist.txt goto start10
if exist O:\exist.txt goto start11
if exist P:\exist.txt goto start12
if exist Q:\exist.txt goto start13
if exist R:\exist.txt goto start14
if exist S:\exist.txt goto start15
if exist T:\exist.txt goto start16

goto fehler1


:start3
xcopy F:\*.* G:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start4
xcopy F:\*.* H:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start5
xcopy F:\*.* I:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start6
xcopy F:\*.* J:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start7
xcopy F:\*.* K:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start8
xcopy F:\*.* L:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start9
xcopy F:\*.* M:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start10
xcopy F:\*.* N:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start11
xcopy F:\*.* O:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start12
xcopy F:\*.* P:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start13
xcopy F:\*.* Q:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start14
xcopy F:\*.* R:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start13
xcopy F:\*.* S:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg

:start14
xcopy F:\*.* T:\*.* /S/V/E/Y/D/C
IF NOT ERRORLEVEL 1 GOTO erfolg
goto erfolg

:fehler1
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo !!!!!! Die Sicherung ist fehlgeschlagen !!!!!!
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
pause
goto end

:erfolg
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo !!!!! Die Sicherung war erfolgreich !!!!!
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
pause
end
exit

:end
exit


Vielen Dank schon jetzt für eure Unterstützung.

Content-Key: 44708

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

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

Member: Biber
Biber Nov 17, 2006 at 19:38:33 (UTC)
Goto Top
Moin Brutschi,

willkommen im Forum.
Hmm, wie sag' ich es bloss... am Besten vorsichtig...
Mit reinem native Batch hast Du wenig Chancen, an die Wochentags- und Monatstexte zu kommen.

Ich empfehle Dir dazu, mal ein bisschen in dem Batch-TutIII "Umgang mit Datums- und Zeitvariablen im Batch" zu schmökern...
...steht im Bereich "Batch & Shell".

Ganz kurzgefasst: Batch kennt keine Datums-Variablen. Nur Text. [..und ein ganz ganz bissi numerische Variablen]

Also: sobald du vom reinen Text "17.11.2006" auf Wochentag oder Kalenderwoche oder gestern oder in 3 Monaten kommen willst,
musst Du jemand fragen, der etwas davon versteht.

Damit meine ich jetzt nicht mich, sondern VBScript oder JScript, die Datumsfunktionen haben.
Das geht mit ein, zwei Zeilen vom Batch aus.

Damit kommst Du auf Wochentags- bzw. Monatsnamens-Texte.
War die erste Hürde.
Dazu die kleine Skizze hier:
::---------snipp minidate.bat
@Echo off & setlocal
Echo Wscript.Echo DatePart(wscript.Arguments(0),Date) >%temp%\miniDateInfo.vbs
for /f %%i in ('cscript //nologo %temp%\miniDateInfo.vbs "w"') do Set "DoW=%%i"  
for /f %%i in ('cscript //nologo %temp%\miniDateInfo.vbs "m"') do Set "Monat=%%i"  
Del %temp%\miniDateInfo.vbs

IF %DoW%==1 Set "cDow=Sonntach"   
IF %DoW%==2 Set "cDow=Montach"   
IF %DoW%==3 Set "cDow=Dienstach"   
IF %DoW%==4 Set "cDow=Mittwoch"   
IF %DoW%==5 Set "cDow=Donnerstach"   
IF %DoW%==6 Set "cDow=Freitach"   
IF %DoW%==7 Set "cDow=Samstach"  

IF %Monat%==1 Set "cMonat=Jänner"  
IF %Monat%==2 Set "cMonat=Februar"  
::....
IF %Monat%==11 Set "cMonat=November"  
IF %Monat%==12 Set "cMonat=Dezember"  

echo Demo1: Monat %Monat% -^> cMonat %cMonat% DoW: %DoW% -^> cDoW: %cDoW%

REM und diese meterlange Eierei in Deinem Entwurf... 
REM ...da drücken wir mal etwas die Luft aus dem Käse...
For %%x in (G H I J K L M N O P Q R S T) do if exist %%x:\exist.txt Set "meinLw=%%x" & goto weiter  
goto keinLaufwerkDa

:weiter
Echo Demo2: Laufwerk gefunden...Laufwerk ist %meinLw% ... xcopy F:\*.* meinLaufwerk%:\%cDow%\*.* /S/V/E/Y/D/C
IF ERRORLEVEL 1 GOTO fehler1

echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo !!!!! Die Sicherung war erfolgreich !!!!!
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
goto end

:fehler1
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
echo !!!!!! Die Sicherung ist fehlgeschlagen !!!!!!
echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
goto end

:keinLaufwerkDa
echo !?!?!?!!?!?!?!!?!?!?!!?!?!?!!?!?!?!
echo !?!?!?! keinLaufwerkDa       !?!?!
echo !?!?!?!!?!?!?!!?!?!?!!?!?!?!!?!?!?!

:end
pause

Output des Demo-Schnipsels (der wesentliche Teil):
>f:\administrator\minidate
Demo1: Monat 11 -> cMonat November DoW: 6 -> cDoW: Freitach
Demo2: Laufwerk gefunden...Laufwerk ist X ... xcopy F:\*.* X:\Freitach\*.* /S/V/E/Y/D/C

Zur zweiten Hürde würde ich ja vorher gerne noch Deinen Plan einholen...

Woran erkennst Du denn, ob eine neue Vollsicherung für den Monat "November" dran ist?
Einfach daran, dass kein Unterverzeichnis "November" da ist auf dem Sicherungslaufwerk?
Und wenn doch eins da ist (vom November 2003) ?

Na ja, erstmal hast Du ja jetzt was zu lesen...

Grüße
Biber
Mitglied: 38520
38520 Nov 17, 2006 at 20:06:16 (UTC)
Goto Top
wow bin ja schwer beeinduckt
Wie du schon sagtest ich habe jetzt ein wenig zu lesen werde mich morgen mal an die Seiten setzen. Im übrigen reicht es mir wenn das skript den januar erkennt und falls vorhanden mit den neuen daten überschreibt damit habe ich schon einen großteil an sicherheit ( 11) Monate und zusätzlich die letzten 8 Tage .
Danke Bieber für die klasse unterstützung !!!!
Mitglied: 38520
38520 Nov 17, 2006 at 20:26:06 (UTC)
Goto Top
Sorry habe es gleich mal auspobiert aber leider kein erfolg gehabt eine wariabe meinlw ist mir aufgefallen allerdings kopiert das skript nicht leider weis ich nicht woran das liegt.
Member: Biber
Biber Nov 17, 2006 at 20:37:41 (UTC)
Goto Top
face-wink
...natürlich kopiert das Skript nicht...
Ich stell doch keine ungetesteten Batch-Skripte hier hin, die auf wildfremden Rechnern Daten ändern...
... ich bin doch nicht die c't... *entrüstet guck*

Also, in der Demo oben steht irgendwo:
....
:weiter
<b>Echo</b> Demo2: Laufwerk gefunden...Laufwerk ist %meinLw% ... xcopy F:\*.* meinLaufwerk%:\%cDow%\*.* /S/V/E/Y/D/C
...

Und solange der xcopy-Befehl nur angezeigt wird und nicht tatsächlich aufgerufen, solange wird auch nix entscheidendes passieren.
Das sollte nur ein Tipp sein, wie Du die erste Hürde nehmen und die Verzeichnisnamen "Montag" bis "Sonntag" und "Januar" bis "Dezember" bekommen könntest.

Außerdem - Du kannst unmöglich schon das ganze Tutorial durchgelesen haben...

Gruß
Biber
Mitglied: 38520
38520 Nov 18, 2006 at 08:16:50 (UTC)
Goto Top
Sorry natürlich habe ich das ganze toturial noch nicht gelesen aber dein Ansatz zur Lösung hat mich einfach neugierig gemacht und ich dachte ich probier das gleich mal. Da ich hier neu bin und dein skript noch nicht vollständig verstanden habe bitte ich dich um Entschuldigung wollte dir nicht zu nahe treten ( sorry) . Meine batch kentnisse sind leider noch sehr (native) wie du so schön erwähnst hast .
PS: hatte auch schon nach dem toturial gesucht aber das war es auch schon.
Member: Biber
Biber Nov 18, 2006 at 14:53:36 (UTC)
Goto Top
Moin Brutschi,

ebenfalls sorry, ich wollte nicht so ruppig erscheinen, wie es vielleicht bei Dir angekommen ist.

Ich denke, ein kleines Missverständnis ist der Anspruch, den ich an dieses Forum und auch die vielen Tipp-Poster hier stelle,
Ich halte nichts davon, so wie es diese Tankstellen-PC-Zeitschriften machen, "das ultimative Utility" und "die 1000 besten sofort einsetzbaren Lösungen" zum Copy-and-Paste anzubieten.
Mir liegt schon etwas daran, dass der Fragesteller hinterher auch in der Lage ist, mit der geposteten Skizze und dem Lösungsweg einen Ansatz zu finden, sein Problem dann selbst zu lösen.. und eben auch das eine oder andere bei anderen Problemstellungen wiederzuverwenden.

Ich hatte mich dann oben aber auch dazu hinreißen lassen, drei Sachen gleichzeitig zu kommentieren bzw. zu kombinieren:
- das Thema "Datumswerte lesbar machen im Batch"... das war der Aspekt, wo ich Dich eigentlich auf den "richtigen" Weg bringen wollte.
- das rein handwerklich Eindampfen der Spaghetticode-Laufwerksprüfung hat gar nichts damit zu tun... gehörte auch gar nicht zur Frage.
Betrachte es als Fussnote oder vergiss es einfach.
- und richtig ungeschickt war es, dass ich dann noch versucht habe, die eigentlichen 10 Demozeilen mit Deiner Vorlage zu verquicken - was natürlich den Eindruck erwecken musste, das wäre eine einsetzbare Komplettlösung.

Deshalb jetzt noch mal die Beschränkung auf das Wesentliche und der rote Faden in Kurzfassung.

1. Mit Batch-Bordmitteln kannst Du nicht sinnvoll mit Datumswerten hantieren. Batch kennt keinen Variablentyp "Datum".
2. Aber: Die einfachen Skript-Utilities, die auch auf dem Rechner schlummern, also VBScript und JScript können das durchaus.
Also kann ich doch aus meinem Batch eine Skript-Funktion aufrufen. Kost doch nix.
3. Dazu erstelle ich in dem Batch temporär eine Datei mit der Endung *.vbs oder *.js und rufe dann den Skript-Interpreter auf.

... im Batch..
@Echo off & setlocal
Echo Wscript.Echo DatePart(wscript.Arguments(0),Date) >%temp%\miniDateInfo.vbs
..Damit erzeuge ich eine Datei "minidateInfo.vbs" im %temp%-Verzeichnis. Im %temp%-Verzeichnis, weil ich die hinterher wieder lösche.
'-----Inhalt der minidateInfo.vbs-----  
Wscript.Echo DatePart(wscript.Arguments(0),Date)
...das heißt, dieses Script gibt das aktuelle Datum "formatiert" zurück in dem Format, dass ich als Parameter mitgebe.

4. Ich rufe das Script zweimal..erst mit dem Paramter "w" wie "Wochentach" und dann mit dem Parameter "m" wie "Monat".
5. Ich speichere den jeweils numerischen Rückgabewert
- und zwar 6 für den Wert für "Freitag" in der Variablen "DoW" (DayofWeek)
- und 11 für den Monatswert in der Variablen %Monat%
- und lösche das *.vbs wieder.
for /f %%i in ('cscript //nologo %temp%\miniDateInfo.vbs "w"') do Set "DoW=%%i"  
for /f %%i in ('cscript //nologo %temp%\miniDateInfo.vbs "m"') do Set "Monat=%%i"  
Del %temp%\miniDateInfo.vbs
6. Und den Wochentagswert bzw. Monatswert übersetze ich in etwas menschenlesbares.
IF %DoW%==1 Set "cDow=Sonntach"   
IF %DoW%==2 Set "cDow=Montach"   
IF %DoW%==3 Set "cDow=Dienstach"   
IF %DoW%==4 Set "cDow=Mittwoch"   
IF %DoW%==5 Set "cDow=Donnerstach"   
IF %DoW%==6 Set "cDow=Freitach"   
IF %DoW%==7 Set "cDow=Samstach"  

IF %Monat%==1 Set "cMonat=Jänner"  
IF %Monat%==2 Set "cMonat=Februar"  
::....
IF %Monat%==11 Set "cMonat=November"  
IF %Monat%==12 Set "cMonat=Dezember"  
Danach hast Du in den Variablen %cDoW% und %cMonat% eben die Texte "Freitag" und "November" stehen...
...und das wollte ich zeigen...
echo Demo1: Monat %Monat% -^> cMonat %cMonat% DoW: %DoW% -^> cDoW: %cDoW%
Dann kann Dein eigentliches Skript starten.

Das war das, was ich schreiben wollte.
Und das Tutorial, das ich meinte, steht unten als zweites unter "Beiträge im gleichen Bereich" in der Liste.

Gruß
Biber
Mitglied: 38520
38520 Nov 18, 2006 at 15:07:00 (UTC)
Goto Top
danke habe gerade im tut III gelesen und veuchte es zu verstehen. Danke nochmal für die ausfühliche erklärung jetzt ist mir einiges klarer geworden dennoch brauche ich noch ein wenig Übung.
die variablen %cDoW solte ich dann in mein skript einsetzen zur Erzeugung der Verzeichnisse zb mit mkdir ? oder liege ich da falsch ?
Mitglied: 38520
38520 Nov 18, 2006 at 15:19:48 (UTC)
Goto Top
meine Ausgabe der miniDateInfo.vbs

Wscript.Echo DatePart(wscript.Arguments(0),Date)

also noch nicht Samstag und November
Member: Biber
Biber Nov 18, 2006 at 15:41:50 (UTC)
Goto Top
Ja, Brutschi,
die Variablen %cDoW% und %cMonth% kannst Du zum z.B zum Anlegen oder Prüfen der Unterzeichnisse verwenden.
Beim Xcopy wird ja implizit ein Verzeichnis angelegt (falls nicht vorhanden).
Dort reicht dann also ein
XCopy <i>[xcopyparameter] quellVerzeichnis\*.*</i> %meinLw%\%cDow%\ 

...wenn denn z.B. alles in das Verzeichnis "Samstag" gesichert werden soll.

Oder eben die Prüfung, ob Unterverzeichnis %meinLw%\November existiert mit..
if exist %meinLw%\%cMonth% goto MonatssicherungSchonVorhanden
Zum zweiten Posting.. probier bitte am CMD-Prompt:
>echo Wscript.Echo DatePart(wscript.Arguments(0),Date)>minidate.vbs

>cscript //nologo minidate.vbs "w" 
7 ---------------> sollte ausgegeben werden

>cscript //nologo minidate.vbs "m" 
11 ---------------> sollte ausgegeben werden

Wenn nicht, bin ich erstaunt.
Gruß
Biber
Mitglied: 38520
38520 Nov 18, 2006 at 16:10:20 (UTC)
Goto Top
Habe einen Fehler gefunden da windows skrip nicht zugelasen wurde kam auch kein Wochentag usw
Member: Biber
Biber Nov 19, 2006 at 19:02:48 (UTC)
Goto Top
Moin Brutschi,

ich kann mit dieser doch eher prosaischen Information wenig anfangen.
Habe einen Fehler gefunden da windows skrip nicht zugelasen wurde kam auch kein Wochentag usw

Was heißt das? Fehler gefunden und abgestellt? Läuft es jetzt?
Oder darfst Du kein VBScript benutzen? Dann musst Du eben den Wochentag per Batch ermitteln bzw. berechnen.
Geht auch (ist ja auch nur eine Formel, nichts zufälliges). Ist aber etwas unappetitlich.
Oder bist Du von dem Plan abgekommen, die Ordner "Montag", "Dienstag", etc zu nennen?

Sag mal bitte an, welchen Status Dein Problem jetzt hat.

Danke
Biber
Mitglied: 38520
38520 Nov 19, 2006 at 22:21:05 (UTC)
Goto Top
Danke für deine Nachfrage, also ich konte kein VB Skript ausführen da mit Xp Antispay ausgeschaltet. Jetzt ist der Stand so, das ich die Datensicherung von Montag bis Freitag bekomme. Habe auch deine Idee goto MonatssicherungSchonVorhanden aufgenommen und umgesetzt, werde Montag nocheinmal einen Durchlauf starten und sehen wie es ist, denke aber das alles so funktioniert wie ich es gedacht hatte. Werde allerings noch darüber nachdenken ob ich nicht alte Daten ( älter als 2 Monate per skript löschen lasse ) damit die Datenflut nicht ins Uferlose läuft.
Danke bis jetzt und hoffe ich darf noch weiter deine Zeit bemühen falls es nicht so funktioniert wie ich denke.
Member: Biber
Biber Nov 19, 2006 at 22:47:45 (UTC)
Goto Top
Danke für die Rückmeldung, Brutschi.

Dann setze ich den Beitrag erstmal auf "gelöst" und schließe ihn aber nicht.

Wie ich in diesem und auch in ähnlichen Beiträgen schon geschrieben habe... mit purem Batch SOLLTE man/frau keine Datumsberechnungen versuchen.
Wenn es irgendwie machbar/vertretbar ist, muss dafür dann VBS/JS eingespannt werden.
Wenn Du es also nutzen kannst, dann geht die ganze Aktion noch relativ stressarm ab.

Früher oder später wird irgend jemand kommen mit der Behauptung
"ich muss aber unbedingt den Wochentag vom nächsten Ersten ermitteln und darf aber keine Utilities und kein VBSkript benutzen..."

..und dann werde ich auch irgendeinen abgedrehten Batch-10-Zeiler posten mit kunstvoll ineinander geschraubten FOR-Anweisungen, der so etwas formelmäßig berechnet.
Möge dieser Tag in weiter Ferne sein oder dieser Kelch ganz an uns vorübergehen..

Also, wenn es bei Dir weitere Fragen gibt: der Thread bleibt offen bis zu Deinem endgültigen OK.

Gruß
Biber
Member: ahe
ahe Nov 20, 2006 at 11:34:10 (UTC)
Goto Top
@Biber, wann machst Du eigentlich mal eine Pause face-smile

Ich habe da was gefunden...
http://www.commandline.co.uk/lib/treeview/index.php?contents.php&.. ...

Die set /a Anweisungen sind leider nicht besonders verständlich (habe doch erst die Paramter nachschauen müssen...), darum ein kurzer Hinweis:


Die Berechnung modulo 100 wird zum Löschen der führenden Nullen bei Tagen und Monaten durchgeführt, z. b.:
set /a dd=100%dd%%%100,mm=100%mm%%%100
aus dem Datum 04.01 wird das Datum 4.1.
dd=04: 10004%100 = 10004 modulo 100 = 4
mm=01: 10001%100= 10001 modulo 100 = 1

Der Algorithmus selbst war mir bislang nicht bekannt, oder hab' ich ihn vergessen...?
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

back-to-topBerechnung des Tages anhand des 20.11.2006
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,dow=153*m+2

z = 14 - 11 = 3
z = 3/12 = 3 div 12 = 0
y = 2006 + 4800 - 0 = 6806
m = 11 + 12*0 - 3 = 8
dow = 153*8 + 2 = 1226

set /a dow=dow/5+dd+y*365+y/4-y/100+y/400-2472630,dow%%=7,dow+=1

dow = 1226/5 + 20 + 6806*365 + 6806/4 - 6806/100 + 6806/400 - 2472630 
    = 245 + 20 + 2484190 + 1701 - 68 + 17 - 2472630 
    = 13475
dow = dow % 7 = dow modulo 7 = 0
dow = dow + 1 = 1

http://www.commandline.co.uk/index.html

back-to-topDateToDOW


The DateToDOW function returns the day of week number for a given calendar date..

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:DateToDOW %yy% %mm% %dd% dow
::
:: By:   Ritchie Lawrence, 2003-04-29. Version 1.1
::
:: Func: Creates a day of week number from a calendar date, where 1 = Mon
::       and 7 = Sun. For NT4/2000/XP/2003.
::
:: Args: %1 year component to be converted, 2 or 4 digits (by val)
::       %2 month component to be converted, leading zero ok (by val)
::       %3 day of month to be converted, leading zero ok (by val)
::       %4 var to receive day of week number, 1 to 7 (by ref)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEEXTENSIONS
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (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
endlocal&set %4=%dow%&goto :EOF
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 	

back-to-topParameters


%1 year component to be converted, 2 or 4 digits (by val)
%2 month component to be converted, leading zero ok (by val)
%3 day of month to be converted, leading zero ok (by val)
%4 var to receive day of week number, 1 to 7 (by ref)


back-to-topAufruf:

DateToDOW 2006 11 20 Tag

echo Der aktuelle Wochentag: %Tag%
Der aktuelle Wochentag: 1

Schön, dass man heute wieder etwas ins Forum schreiben kann, am Freitag ist mir das den ganzen Nachmittag (bis ca. 19:00) nicht gelungen... face-smile

mfg
Axel
Mitglied: 38520
38520 Nov 20, 2006 at 12:05:33 (UTC)
Goto Top
Hallo Axel
Danke für deine Hilfe bin mit meiner batch soweit Fertig Trotzdem danke für deine Unterstützung.
Member: Biber
Biber Nov 20, 2006 at 20:28:20 (UTC)
Goto Top
@AxelHahn

Na ja, wollen wir mal für Ritchie hoffen, dass er noch andere Hobbies hat....

Wenn ich versuchen würde, den Wochentag und den Monatsnamen mit purem Batch zu ermitteln, würde ich gut die doppelte Zeilenanzahl brauchen...
Und selbst in meiner lyrischen Programmierweise wird es eventuell verwirrend für Einsteiger.

Bei mir würde etwas in dieser Art rauskommen:
:: ------snipp ErmittlungWochentagsUndMonatsNamenMitNativeBatch.bat
:: Batch-Implementierung nach http://de.wikipedia.org/wiki/Wochentagsberechnung Biber 2006
@echo off & Setlocal & set /a "MyLeapkorr=0"  & Set "mydate=%1"  
If [%1]== (for %%i in (%date%) do set "mydate=%%i")  
for /f "tokens=1-3 delims=." %%i in ("%mydate%") do set /a "myTT=10%%i %% 100,myMM=10%%j %% 100,myJJ=%%k"  
REM Nebenrechnungen: 
REM Step1: myTZ=Tagesziffer = myTT mod 7
REM Step2: Monatsziffer = Jan=0  Feb=3  Mrz=3  Apr=6  Mai=1  Jun=4 
REM   myMZ           Jul=6  Aug=2  Sep=5  Okt=0  Nov=3  Dez=5
REM Step3: myJHZ=Jahrhundertziffer = Jahrhundert mod 4-3) *-2
REM Step4: myJZ=Jahrsziffer = Jahreszahl + Jahreszahl div 4 mod 7. 
REM Step5  myLeapyear.... wenn Schaltjahr und der Monat=Jan oder Feb ist, dann 6 addieren.
REM 
FOR %%a in (1:Januar:0 2:Februar:3 3:März:3 4:April:6 5:Mai:1 6:Juni:4 7:Juli:6 8:August:2 ^
               9:September:5 10:Oktober:0 11:November:3 12:Dezember:5) do (
For /f "Tokens=1-3 delims=:" %%i in ("%%a") do if %MyMM%==%%i set /a "MyMZ=%%k" & set "MycMonth=%%j")  
If %myMM% LEQ 2 for /f %%i in ('set /a myJJ %% 4') do (  
     if %%i == 0 for /f %%j in ('set /a myJJ %% 100') do if %%j GTR 0 set /a "myLeapKorr=6")    

If [%2]== goto skip
For /f %%i in ('Set /a myTT %% 7') do Echo [Step1: Tagesziffer MyTZ von %mydate% = %%i]  
Echo [Step2: Monatsziffer MyMZ von %mydate% = %myMZ%]
For /f %%i in ('Set /a ^(^(^(myJJ / 100^) %%4^) -3^) * -2') do Echo [Step3: Jahrhundertziffer MyJHZ von %mydate% = %%i]  
For /f %%i in ('Set /a ^( myJJ %% 100 + myJJ %% 100 / 4^) %% 7') Do Echo [Step4: Jahresziffer MyJZ von %mydate% = %%i]  
echo [Step5: Schaltjahreskorrektur %myLeapKorr%]

:skip
Set /a "myDoW=(myTT %% 7 + myMZ + (myJJ%%100 + myJJ%%100 / 4) %% 7 + ( myJJ /100 %%4 -3) * -2 + myLeapkorr) %% 7"  
For  %%i in (0:Sonntag 1:Montag 2:Dienstag 3:Mittwoch 4:Donnerstag 5:Freitag 6:Samstag) do (
    for /f "tokens=1-2 delims=:" %%j in ("%%i") do (if %%j==%myDoW% Set "mycDoW=%%k"))  
echo Datum: %mydate% DoW: %mydow% Wochentag: %mycDow% Monatsname: %MycMonth%
...und je nachdem, ob einen zweiten Parameter mitgebe oder nicht, eine Kommentierung der Zwischenschritte rausfallen oder halt nicht.
(=21:10:39  D:\temp=)
>f:\ErmittlungWochentagUndMonatsnamenMitNativeBatch.bat 9.11.1989 verbose
[Step1: Tagesziffer MyTZ von 9.11.1989 = 2]
[Step2: Monatsziffer MyMZ von 9.11.1989 = 3]
[Step3: Jahrhundertziffer MyJHZ von 9.11.1989 = 0]
[Step4: Jahresziffer MyJZ von 9.11.1989 = 6]
[Step5: Schaltjahreskorrektur 0]
Datum: 9.11.1989 DoW: 4 Wochentag: Donnerstag Monatsname: November

(=21:12:14  D:\temp=)
>f:\ErmittlungWochentagUndMonatsnamenMitNativeBatch.bat %date%
Datum: 20.11.2006 DoW: 1 Wochentag: Montag Monatsname: November

(=21:23:17  D:\temp=)
>f:\ErmittlungWochentagUndMonatsnamenMitNativeBatch.bat 11.9.2001
Datum: 11.9.2001 DoW: 2 Wochentag: Dienstag Monatsname: September

(=21:23:36  D:\temp=)
>f:\ErmittlungWochentagUndMonatsnamenMitNativeBatch.bat 11.9.2001 debug
[Step1: Tagesziffer MyTZ von 11.9.2001 = 4]
[Step2: Monatsziffer MyMZ von 11.9.2001 = 5]
[Step3: Jahrhundertziffer MyJHZ von 11.9.2001 = 6]
[Step4: Jahresziffer MyJZ von 11.9.2001 = 1]
[Step5: Schaltjahreskorrektur 0]
Datum: 11.9.2001 DoW: 2 Wochentag: Dienstag Monatsname: September

Aber, wie ich schon mehrfach hier im Forum geschrieben habe:
Wer solche Aktionen mit native Batch versucht, muss entweder ganz fit im Bätchen sein oder ganz schön blöd.

Diese Variante also wirklich nur aus sportlichen Gründen... bitte nicht an die c't verkaufen.

Grüße
Biber
Mitglied: 38520
38520 Nov 23, 2006 at 13:48:01 (UTC)
Goto Top
Hallo Bieber leider hat sich bei mir ein Fehler eingeschlichen den ich immer wieder übersehe .
Und zwar wollte ich das bei der Sicherung der Monat estellt wird und die Daten da hinnein kopiert werden. Das tut es auch, allerdings jeden Tag und das wollte ich nicht nur beim leeren Monat. Kannst du bitte mal einen Blick drauf werfen wo der Fehler ist.

For %%x in ( J K L M N O P Q R S T) do if exist %%x:\exist.txt Set "meinLw=%%x" & goto weiter
goto keinLaufwerkDa

:weiter
echo Laufwerk gefunden...Laufwerk ist %meinLw% ...

if exist %meinLw%\%cMonth%\ goto MonatssicherungSchonVorhanden


rem xcopy b:\*.* %meinLw%:\%cMonat%\*.* /S/V/E/Y/D/C


:MonatssicherungSchonVorhanden

rem xcopy b:\*.* %meinLw%:\%cDow%\*.* /S/V/E/Y/D/C
Member: Biber
Biber Nov 23, 2006 at 14:37:39 (UTC)
Goto Top
Sorry, brutschi,

mein Fehler.
Ich habe oben in den Beispielschnipseln mal den Monatsnamen (z.B. "November") in eine Variable %cMonth% und mal in eine Variable %cMonat% geschrieben.

Das hat sich auch bei Dir vermischt.
Du prüfst
...
if exist %meinLw%\%cMonth%\ goto MonatssicherungSchonVorhanden
... und kopierst aber nach
xcopy b:\*.* %meinLw%:\%cMonat%\*.*

da liegt der Fehler vermutlich.
Prüfe von oben (ggf. mit "Suchen nach" in Deinem Texteditor), welche Variable verwendet wird und zieh das glatt.
Dann sollte es laufen.

Gruß
Biber
Mitglied: 38520
38520 Nov 23, 2006 at 15:17:24 (UTC)
Goto Top
Jo so ist es.
Danke habe ich glatt überlesen.