Batch-Programmierung: Programm funktioniert nur von 10:00Uhr - 23:59Uhr

emulbetsup

Vice Admiral Special
Mitglied seit
09.02.2006
Beiträge
523
Renomée
24
Hallo,
habe ein kleines Problem mit der Programmierung eines Backup Skriptes.

Das Programm soll einen Ordner erstellen dessen Namen das aktuelle Datum und die aktuelle Uhrzeit enthält.

Allerdings werden bei Win2k einstellige Uhrzeiten auch einstellig angezeigt (09:23:74 = 9:23:74) und deshalb funktioniert der Zugehörige Befehl zur Definition der Uhrzeit dann nicht.

Hier mal der Code:
Code:
@ECHO OFF 

ECHO Aktuelles Backup wird erstellt.

ECHO.

ECHO Bitte Warten...

ECHO.
ECHO.
ECHO.

REM Aktuelle Zeit holen und Doppelpunkte durch Punkte ersetzen
set CURRENTTIME=%TIME::=.%

REM Nur erste 6 Zeichen der Zeit verwenden: HH.MM.SS
set CURRENTTIME=%CURRENTTIME:~0,6%

REM Datumsformat umwandeln von <DN DD.MM.YYYY> in <DD.MM.YYYY>
set CURRENTDATE=%DATE:~3,12%

REM Archivnamen zusammensetzen
set ARCHIVNAME=%CURRENTDATE%-%CURRENTTIME%

C:
cd \
md Backup
cd Backup
md %ARCHIVNAME%
ECHO.

xcopy C:\Lexware\*.* C:\Backup\%ARCHIVNAME%\ /S /E /V /I /Q /H /R /Y 
ECHO.

E:
cd \
md Backup
cd Backup
md %ARCHIVNAME%
ECHO.

xcopy C:\Backup\%ARCHIVNAME%\*.* E:\Backup\%ARCHIVNAME%\ /S /E /V /I /Q /H /R /Y

ECHO.
ECHO.
ECHO.

ECHO Backup erfolgreich erstellt...

ECHO.

PAUSE

Hat jemand eine Idee wie ich das lösen kann. Bei einer if = goto Abfrage der ersten Stelle würden dann die Uhrzeiten 1x und 2x auch falsch interpretiert werden.

Grüße, Christian
 
Zuletzt bearbeitet:
Eine direkte Problemlösung kann ich dir leider nicht anbieten, evtl. aber einen Workaround.

Ich würde versuchen das ganze über eine If = Goto Abfrage zu erledigen welche direkt überprüft um welche Stundenzahl es sich handelt. Dabei nimmst du jeweils die ersten beiden Stellen der Uhrzeit. Bei den zweistelligen Zeiten kann du direkt die Uhrzeit eintragen (10-23Uhr), bei den einstelligen einfach den Doppelpunkt mit in den Vergleich einziehen.

Beispiel (17:12Uhr):
if "erstebeidenZeichen" = "17" --> Uhrzeit so übernehmen

Beispiel (9:12Uhr):
if "erstebeidenZeichen" = "9:" --> Die ersten beiden Stellen mit "09" überschrieben und die restliche Uhrzeit an den String anhängen.

Das jetzt nur mal so als Gedankengang
Hoffe es hilft ein wenig!

€: Evtl. reicht es auch nur die "einstelligen" Uhrzeiten zu überprüfen da man bei den zweistelligen Zahlen nicht korrigieren muss.
€2: Ich weiss nicht ob es eine Funktion gab die die Zeichenlänge des Strings ausgeben kann (if zeichenlänge = ....)
So könnte man die Länge des Uhrzeitstrings überprüfen (sollen ja 8Zeichen sein ?!) .. wenn es 7 Zeichen sind einfach vorne eine 0 anfügen.
 
Zuletzt bearbeitet:
Zwieback schrieb:
Allerdings werden bei Win2k einstellige Uhrzeiten auch einstellig angezeigt (09:23:74 = 9:23:74) und deshalb funktioniert der Zugehörige Befehl zur Definition des Datums dann nicht.
Ist auf meinem XP-System genauso. Stunden kleiner 10 werden nur einstellig ausgegeben, obwohl in den Regions- und Sprachoptionen das Gegenteil eingestellt ist und sich auch alle GUI-Programme daran halten. Tja, Glückwunsch: du hast einen Bug gefunden, den MS aber sicher nicht mehr beheben wird ;D.

Lösung: Stunden in Variable speichern und wenn kleiner 10 (bzw. Leerzeichen enthalten), dann Variable neu setzen, also so:
Code:
REM Aktuelle Zeit holen und Doppelpunkte durch Punkte ersetzen
set CURRENTTIME=%TIME::=.%

REM Nur erste 2 Zeichen der Zeit verwenden: HH
set CURRENTHOUR=%CURRENTTIME:~0,2%
REM Leerzeichen durch Nullen ersetzen
set CURRENTHOUR=%CURRENTHOUR: =0%

REM Nur Zeichen 2 bis einschl. 6 der Zeit verwenden: MM.SS
set CURRENTTIME=%CURRENTHOUR%%CURRENTTIME:~2,6%

Alles klar? Noch Fragen?

EDIT: Noch ein Hinweis: Bitte nicht einfach "Vorgang erfolgreich" ausgeben, das verwirrt nur und man denkt, das Backup wurde überprüft. Ich würde den Errorlevel von xcopy auswerten und die Ausgabe entsprechend anpassen.

MfG Dalai
 
Zuletzt bearbeitet:
Es gibt die Möglichkeit das Standard-Datumsformat während der Batch-Abarbeitung zu ändern. Wenn ich Montag wieder auf Arbeit bin schau ich mal wie ich das für das dortige Backup gelöst hatte.

Gruß, Chris
 
Danke für eure Hilfe, werde mich wohl morgen ans Umschreiben machen

EDIT: Noch ein Hinweis: Bitte nicht einfach "Vorgang erfolgreich" ausgeben, das verwirrt nur und man denkt, das Backup wurde überprüft. Ich würde den Errorlevel von xcopy auswerten und die Ausgabe entsprechend anpassen.
MfG Dalai

Wie läßt sich der Errorlevel anzeigen/auswert? Durch /v sollten doch alle kopierten Dateien mit den Quelldateien übereinstimmen, oder?

Viele Grüße,

Christian

EDIT: @ Chris_Bear: Funktioniert dein Vorschlag auch bei Uhrzeiten? Hab fälschlicherweise im ersten Post was durcheinandergeworfen.... (jetzt geändert)
 
Zuletzt bearbeitet:
Zwieback schrieb:
Wie läßt sich der Errorlevel anzeigen/auswert? Durch /v sollten doch alle kopierten Dateien mit den Quelldateien übereinstimmen, oder?
Ja, /v überprüft die Dateien (verify), aber wenn du z.B. nicht genug Speicherplatz hast oder keine Schreibrechte oder Fehler im Dateisystem.... You catch my drift?

Errorlevel überprüfen geht ganz einfach:
Code:
Programm.exe param1 param2
if %errorlevel% NEQ 0 goto ERROR
goto :EOF

:ERROR
echo Fehler aufgetreten
oder einfacher bzw. ohne GOTO:
Code:
Programm.exe param1 param2
if %errorlevel% NEQ 0 (
    echo Fehler aufgetreten
    goto :EOF
)

MfG Dalai
 
Zuletzt bearbeitet:
So, hier ist die Lösung für's Datum:
Code:
rem ###############################
rem #
rem # Set up %date% variable to yyyy-mm-dd regardless of regional settings
rem #
rem ###############################
FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%yyyy%-%mm%-%dd%
Sollte ähnlich auch mit der Zeit gehen.

Gruß, Chris
 
@Chris_Bear: Deine Lösung funktioniert aber nur, wenn das Datumsformat auf amerikanisch gestellt ist bzw. im Format dd/mm/yyyy (oder mm/dd/yyy, jedenfalls mit Slashes) ist, weil du nach Slashes als Trennzeichen suchst, die es auf einem System mit deutschem Datumsformat nicht gibt. Ich bekomme als Ausgabe von
Code:
date /t
ein
Code:
06.10.2008
und entspricht demzufolge der Ausgabe von
Code:
echo %date%

Selbst die erste Zeile funktioniert irgendwie nicht, weil du %%B benutzt, aber nur ein Token für %%A existiert und die Platzhalterwerte demnach auch dort bleiben.

Ich finde meine Lösung jedenfalls eleganter, zumal sie auch funktioniert, wenn das Zeitformat ein anderes sein sollte. Ich ersetze einfach alle Leerzeichen durch Nullen und fertig is.

MfG Dalai
 
Ups, stimmt. Mir reicht es hier wenn die beiden kanadischen und das US-Format abgedeckt sind, da sind mir die Punkte gar nicht aufgefallen.

Dann ist deine Lösung wirklich die bessere, vielleicht bau ich das auf Arbeit auch noch um wenn ich mal wieder an das Skript ran muss.

Gruß, Chris
 
Ich ersetze einfach alle Leerzeichen durch Nullen und fertig is.

Das funktioniert leider auch nicht, da die ersten beiden Stellen bei Uhrzeiten vor 10:00 Uhr nicht " H" sind, sondern "H:"

Wahrscheinlich komme ich um eine IF GOTO Abfrage nicht herum. Habe jetzt auch schon einen Lösungsweg, allerdings mache ich Fehler in der Syntax:

Code:
REM Aktuelle Zeit holen und Doppelpunkte durch Punkte ersetzen
SET CURRENTTIME=%TIME::=.%

REM Nur erste 2 Zeichen der Zeit verwenden: HH
SET CURRENTHOUR=%CURRENTTIME:~0,1%

IF CURRENTHOUR="0." GOTO HHC
IF CURRENTHOUR="1." GOTO HHC
IF CURRENTHOUR="2." GOTO HHC
IF CURRENTHOUR="3." GOTO HHC
IF CURRENTHOUR="4." GOTO HHC
IF CURRENTHOUR="5." GOTO HHC
IF CURRENTHOUR="6." GOTO HHC
IF CURRENTHOUR="7." GOTO HHC
IF CURRENTHOUR="8." GOTO HHC
IF CURRENTHOUR="9." GOTO HHC

GOTO HHNC

:HHC
SET CURRENTHOUR2=0%CURRENTHOUR:~0%
GOTO FOLDERNAME

:HHNC
SET CURRENTHOUR2=%CURRENTHOUR%
GOTO FOLDERNAME

:FOLDERNAME
REM Uhrzeit aus Stunde und Rest zusammensetzen
SET CURRENTTIME2=%CURRENTHOUR2%%CURRENTTIME:~3,6%

REM Windows 2K Datumsformat umwandeln von <DN DD.MM.YYYY> in <DD.MM.YYYY>
REM set CURRENTDATE=%DATE:~3,12%

REM Windows XP Datumsformat (unverändert)
SET CURRENTDATE=%DATE%

REM Archivnamen zusammensetzen
SET ARCHIVNAME=%CURRENTDATE%-%CURRENTTIME2%

Irgendwas scheint mit meiner IF GOTO Abfrage nicht zu stimmen.

Code:
IF CURRENTHOUR="0." GOTO HHC

Wie müßte die Zeile richtig heißen?

Grüße,

Chrisitan
 
Zwieback schrieb:
Das funktioniert leider auch nicht, da die ersten beiden Stellen bei Uhrzeiten vor 10:00 Uhr nicht " H" sind, sondern "H:"
Bei mir nicht. Ich bekomme bei
Code:
echo %time%
bei Zeiten vor 10 Uhr immer ein führendes Leerzeichen zurück. Welches SP hast du auf deinem Win2k? Prüf das mal nach, was ein echo %time% genau ausgibt, ob dort wirklich kein Leerzeichen drin ist. Ich hab bisher immer eins gehabt.

MfG Dalai
 
Zurück
Oben Unten