teddyhamster2000
Goto Top

Robocopy, Ordner erstellen mit Datum und Zeit, EDIT Auswertung von Ping

Hallo Forum,

ich bin dabei ein Batch-Script zu basteln, welches mir für Backups Ordner X nach Zeil Y kopiert und dem neuen Ordner dann noch das aktuelle Datum und die Zeit mitgibt.

Sieht aktuell so aus:

set datum=%date%
set zeit=%time%

robocopy "C:\Documents and Settings\%username%\Favorites" /MIR "\\Server\Share$\Backup\Backup.%datum%.%zeit%" /log+:\\Server\Share$\Backup\log.txt


Das ganze funktioniert leider nur mit dem aktuellen Datum.

Sieht also aktuell so aus: \\Server\Share$\Backup\Backup.Datum

Soll aber so aussehen: \\Server\Share$\Backup\Backup.Datum.Zeit

Ich habe schon alle möglichen Variationen ausporbiert. Ich verstehe einfach nicht, warum er die Zeit nicht "frisst". Zuerst dachte ich, dass es nicht geht, weil der Befehl "date" bzw. "time" ja eigentlich eine Eingabe erfordert. Da es mit dem Datum ja aber schon geht...

Vielleicht habt ihr eine Idee?

Danke & Gruß

Content-ID: 105056

Url: https://administrator.de/forum/robocopy-ordner-erstellen-mit-datum-und-zeit-edit-auswertung-von-ping-105056.html

Ausgedruckt am: 23.12.2024 um 08:12 Uhr

bastla
bastla 02.01.2009 um 13:34:26 Uhr
Goto Top
Hallo Teddyhamster2000!

Da in der Zeitangabe Doppelpunkte enthalten sind, kann diese nicht als Bestandteil des Dateinamens verwendet werden ...

Wenn Du Datum- und Zeitstrings selbst zusammenbaust, kannst Du auch zB die Schreibweise "JJJJMMTT" für das Datum verwenden (was etwa das Sortieren leichter macht):
set "datum=%date:~-4%%date:~-7,2%%date:~-10,2%"  
set "zeit=%time:~0,2%%time:~3,2%%time:~6,2%"  
Trennzeichen kannst Du je nach Wunsch noch ergänzen (jeweils zwischen die beiden aufeinander folgenden "%"-Zeichen setzen) ...

[Edit]
Da bei einstelligen Stundenzahlen in der Uhrzeit (also für Zeiten vor 10:00:00) ein (störendes) Leerzeichen am Anfang des Zeitstrings landet, folgende verbesserte Version:
set "zeit=%time:~0,2%%time:~3,2%%time:~6,2%"  
set "zeit=0%zeit: =%"  
set "zeit=%zeit:~-6%"  
Die Zeile 2 setzt vor den bisherigen Zeitstring noch eine Null und ersetzt dann alle enthaltenen Leerzeichen (kann eigentlich ohnehin nur jenes am Anfang sein) durch "Nichts" (entfernt also die Leerzeichen).

Die Zeile 3 nimmt von dem so behandelten String nur die letzten 6 Stellen (damit nicht auch vor zweistelligen Stundenzahlen noch die "0" steht); sollten noch Trennzeichen vor und nach der Minutenzahl verwendet werden, dann natürlich die letzten 8 Zeichen verwenden.
[/Edit]

Grüße
bastla
Teddyhamster2000
Teddyhamster2000 02.01.2009 um 14:05:15 Uhr
Goto Top
Hallo bastla!

Danke für die Antwort! Hat wunderbar geklappt ;)

Was ich noch nicht verstehe, ist dass das Lofile immer überschrieben wird, obwohl ich /log+: verwendet habe...

Edit: War falsch was ich gesagt habe, er überschreibt es nicht, er ergänz das Logfile.

Thema ist also geklärt!
Teddyhamster2000
Teddyhamster2000 03.01.2009 um 15:29:48 Uhr
Goto Top
EDIT: ###

Neues Problem:

Wollte in dem Script noch prüfen, ob der Server per Ping erreichbar ist. Als Vorbild habe ich mir das genommen:

Automatisierte Sicherung per Robocopy - Dienst auf externe Festplatte

Bie mir sieht das aktuell so aus:

.
.
ping %server% -n 1
echo errorlevel:%errorlevel%
if errorlevel==1 (goto C) else (goto D)
:C
net send %username% Stelle sicher, dass der Server erreichbar ist!
exit

:D
rem hier geht es weiter
.
.

Zum Testen habe ich einen Server genommen, der eingeschaltet ist. ErrorLevel ist also 0 -> Script funktioniert.
Bei einem anderen Server, der nicht eingeschaltet ist liefert der Ping eine "Zeitüberschreitung", und dennoch (?!) ErrorLevel 0 -> damit macht das Script trotzdem weiter (logischerweise)
ErrroLevel 1 bekomme ich aktuell nur hin, wenn ich einen Server nehme, den es nicht gibt, damit liefert Ping "unbekannter Host" und bringt ErrorLevel 1.

Muss ich das verstehen?
bastla
bastla 03.01.2009 um 15:38:42 Uhr
Goto Top
Hallo Teddyhamster2000!

Versuch es mit der Schreibweise
if errorlevel 1 (net send %username% Stelle sicher, dass der Server erreichbar ist! & goto :eof)
Noch als Anmerkung: Unter W2000 wird der Errorlevel ev nicht ordnungsgemäß gesetzt ...

Grüße
bastla
Teddyhamster2000
Teddyhamster2000 03.01.2009 um 15:42:34 Uhr
Goto Top
Danke, werde ich mal versuchen.

Aha, es ist Windows 2000 (zumindest ein w2k Client, auf dem ich das Script teste). Weißt du auch warum? Google erzählt nicht ganz so viel zu dem Thema.

Gruß

Edit: Problem wurde hier auch schon mal beschrieben:

DOS Batch Errorlevel geht unter XP, aber nicht unter W2K

Ist offenbar ein gut gehüteter MS insider Witz...
Teddyhamster2000
Teddyhamster2000 04.01.2009 um 23:47:54 Uhr
Goto Top
Zitat von @bastla:
Hallo Teddyhamster2000!

Versuch es mit der Schreibweise
> if errorlevel 1 (net send %username% Stelle sicher, dass der Server
> erreichbar ist! & goto :eof)
> 
Noch als Anmerkung: Unter W2000 wird der Errorlevel ev nicht
ordnungsgemäß gesetzt ...

Grüße
bastla

Ich kam jetzt erst zum Testen. Dein Vorschlag funktioniert genau so wie meiner... Das ändern auch nichts, an dem ErrorLevel unter W2k für Ping... face-sad
bastla
bastla 05.01.2009 um 11:49:47 Uhr
Goto Top
Hallo Teddyhamster2000!
Das ändern auch nichts, an dem ErrorLevel unter W2k für Ping... face-sad
... was anzunehmen, mir damals aber noch nicht bekannt war ...

Du kannst aber natürlich den Text der "ping"-Ausgabe auswerten, etwa:
ping %server% -n 1|findstr "Antwort" >nul || (net send %username% Stelle sicher, dass der Server erreichbar ist! & goto :eof)
Grüße
bastla
Barney
Barney 29.04.2011 um 16:11:25 Uhr
Goto Top
sry, wenn ich diesen älteren Beitrag nochmal hervorhole. Ich habe aber teilweise Infos aus dem zitierten Code übernommen.

Ich setzte Win7 SP1 ein und möchte mit robocopy auf eine externe Festplatte sichern. Dazu habe ich als ersten Versuch folgendes Skript benutzt:

::        --------------------------- Variablen leeren ---------------------------
set Quelle=
set Ziel=

::        -------------------------------- Variablen setzen ---------------------------------

set "datum=%date:~-4%%date:~-7,2%%date:~-10,2%"  
set "zeit=%time:~0,2%%time:~3,2%%time:~6,2%"  
set "zeit=0%zeit: =%"  
set "zeit=%zeit:~-6%"  
set Quelle=C:\users\Uli\Desktop
set Ziel=E:\Backup\Schleppi\sicherung%datum%_%zeit%

mkdir %Ziel%

::        --------------------- Starten der Robocopy ----------------------
@Echo off
robocopy.exe %Quelle% "%Ziel%" /MIR /MT:8  >> "e:\desktop.txt"  

pause

Die Sicherung klappt, jedoch wird der Ordner der Sicherung nicht wie vorgegeben benannt sonder quasi von der Quelle übernommen. Im Dateiexplorer wird er als "Desktop" ohne Zusatz von Datum und Zeit angezeigt. In der Konsole heißt er wie oben im Script vorgegeben. Sobald ich als Quelle einen anderen Ordner angebe, klappt alles zu 100%.

Hat jemand eine Idee?

Grüße
bastla
bastla 29.04.2011 um 16:45:28 Uhr
Goto Top
Hallo Barney!

Sich hier "dranzuhängen" ist vermutlich nicht die allerbeste Idee - unter der Annahme, dass Du Teddyhamster2000 vermutlich nicht dazu animieren wirst, seinem letzten Login vom Dreikönigstag des Jahres 2009 ein aktuelles folgen zu lassen, könnten wir hier ziemlich unter uns bleiben ...

... wobei ich (abgesehen vom Entfernen der unnötigen Zeilen 2 bis 4 und 15 und einem Hinzufügen von "setlocal" sehr weit oben im Code) eigentlich nur einen spontanen Einfall hätte: Setze auch "%Quelle%" in der Zeile 19 unter Anführungszeichen ...

Grüße
bastla
Biber
Biber 29.04.2011 um 17:37:44 Uhr
Goto Top
Moin Barney,

ergänzend zu bastlas Hinweisen nur ein weiterer: Bei einen Robocopy von "C:\users\DeinUsername" solltest du unter Win7 besser den Schalter /XJ zusätzlich verwenden.
Sonst hast du unter Umständen ein paar komische Seiteneffekte.

Anyway: Sollte das In-Anführungszeichen-Setzen der %Quelle% nichts helfen, dann mach bitte eigenen Beitrag auf.

Grüße
Biber