306
n4426

Frage ist gelöst
Gesicherte Ordnergröße in Log schreiben

Mitglied: pbelcl
08.02.2012
18:30:41 Uhr
430 Aufrufe
12 Antworten
Ich möchte nach Robocopy Job die Ordnergröße des Zielpfades in ein LOG schreiben
Hi Leute,

Ich habe mir mit Robocopy einige Sicherungsjobs gebastelt die mir die Meldungen von Robocopy in eine Logdatei schreiben.
Nun würde ich auch noch gerne die Größe der gesicherten Zielverzeichnisse in diese Logdatei dazuschreiben.

Eine Suche hier hat viele Fundstellen ergeben, aber nichts was für mich passt.
Alledings habe ich einen Hinweis auf das kleine Tool DIRUSE.exe aus dem Recourcekit gefunden.
Ein Test mit

01.
DIRUSE.EXE /s /m /, /* p:\Daten

befördert eigentlich schon das gewünschte Ergebnis zu Tage, denn das Programm gibt in der letzten Zeile die gewünschte Gesamtgröße des Ordners aus!

78.913.76 32607 TOTAL

Die Frage ist nur, wie bekomme ich den Wert "78.913.76" ohne grossen Aufwand in eine Variable rein ??

Kann mir vielleicht jemand ein paar Codeschnipsel posten?

Grus Paul

Mitglied: bastla
bastla schreibt am 08.02.2012 um 18:48:11 Uhr
Hallo pbelcl!
Die Frage ist nur, wie bekomme ich den Wert "78.913.76" ohne grossen Aufwand in eine Variable rein ??
Eigentlich nicht anders, als eine VOL-Ausgabe - nur noch einfacher ... face-wink

Grüße
bastla

P.S.: Wir hätten da was ...
Mitglied: pbelcl
pbelcl schreibt am 08.02.2012 um 19:26:48 Uhr
Zitat von bastla:
Eigentlich nicht anders, als eine VOL-Ausgabe - nur noch
einfacher ... face-wink
Da hast du absolut recht!!!!
Ich hab's eh gesucht, nur konnte ich nicht mehr genau erinnern....

Werd mal versuchen ob ich das alleine hinbekomme ... face-wink
Mitglied: pbelcl
pbelcl schreibt am 08.02.2012 um 20:33:38 Uhr
Zitat von bastla:
P.S.: Wir hätten da was ...
Tja, und damit hab ich es nun auch schon geschafft face-wink

01.
FOR /F "tokens=1 delims= " %%i in (DIRUSE.EXE /s /m p:\daten ^|findstr "TOTAL"') do set groesse=%%i

Jetzt hat mein Perfektionismus nur noch ein Ziel:
Die Größe der Ordner hat oft unterschiedliche Länge.
Jetzt muss ich das nur noch so mit Leerzeichen füllen dass die Zahl im LOG immer rechts an der gleichen Stelle steht...
Mitglied: bastla
bastla schreibt am 08.02.2012 um 21:41:58 Uhr
Hallo pbelcl!
Jetzt muss ich das nur noch so mit Leerzeichen füllen dass die Zahl im LOG immer rechts an der gleichen Stelle steht...
Ich fasse das noch nicht als Frage auf - aber vielleicht trotzdem ein Hinweis: set /? (etwa 4. Seite bei defaultmäßiger Größe des CMD-Fensters)

Übrigens sind "tokens=1 delims= " ebenfalls Default und könnten daher weggelassen werden ...

Grüße
bastla
Mitglied: pbelcl
pbelcl schreibt am 08.02.2012 um 22:15:19 Uhr
Zitat von bastla:
Übrigens sind "tokens=1 delims= " ebenfalls Default und könnten daher weggelassen werden ...
DANKE!!

Zitat von bastla:
Ich fasse das noch nicht als Frage auf - aber vielleicht trotzdem ein Hinweis: set /? (etwa 4. Seite bei defaultmäßiger Größe des CMD-Fensters)
Danke für den Tipp!
Ich werds mal versuchen, wenn ich's nicht schaffe dann FRAGE ich face-wink

lg
Paul
Mitglied: pbelcl
pbelcl schreibt am 09.02.2012 um 19:40:52 Uhr
Hi bastla,

Ich habe in meiner ganzen Sache leider schon vor einiger Zeit einen Bug einbauen müssen, der mir leider jetzt auf dem Kopf fällt.
Um nicht die ganze Sache unnätig kompliziert zu machen:

Kann ich aus einer Variable irgendwie ein Leerzeichen am Ende rausbekommen, aber nur wenn da auch eines ist ??
Mitglied: bastla
bastla schreibt am 09.02.2012 um 20:26:18 Uhr
Hallo pbelcl!

Etwa so:
if "%var:~-1%"==" " set "var=%var:~,-1%"
Grüße
bastla
Mitglied: pbelcl
pbelcl schreibt am 10.02.2012 um 14:09:36 Uhr
> Zitat von bastla:
> Ich fasse das noch nicht als Frage auf - aber vielleicht trotzdem ein Hinweis: set /? (etwa 4. Seite bei defaultmäßiger Größe des CMD-Fensters)

Ich habe mich nun schon einen halben Tag gespielt, komm aber nicht drauf!
Inzwischen ist es mir gelungen jeden beliebigen Bereich aus der Variable zu extrahieren, aber MEHR als drinnen steht kann ich nicht bekommen ;-(

01.
FOR /F %%i in ('DIRUSE.EXE -s -m -, "p:\Software\" ^|findstr "TOTAL"') do set groesse=%%i

Da kommen unterschiedliche Werte zurück. Der längste ist "217336.75"

Ich will nun diese Zahl in eine Variable reinbringen und mit Leerzeichen DAVOR sagen wir 15 Stück auffüllen. Wären in diesem Fall 7 Leerzeichen
Wenn die Zahl nur "22.55" ist sollen 11 Leerzeichen davor. sodass es in meinem Log dann immer so aussieht:

10.02.2012 um 14:07:51 keine veraenderten Dateien gefunden. 217336.75 MB S:\ nach Y:\S\
10.02.2012 um 14:07:55 keine veraenderten Dateien gefunden. ........45.66 MB P:\daten\Access nach Y:\P\daten\Access


(stell dir statt der "." Leerzeichen vor face-wink
Das bring ich einfach nicht zusammen...

geht das denn überhaupt??
Mitglied: bastla
bastla schreibt am 10.02.2012 um 14:47:11 Uhr
Hallo pbelcl!

Versuch es so:
01.
FOR /F %%i in ('DIRUSE.EXE -s -m -, "p:\Software\" ^|findstr "TOTAL"') do set "groesse=                       %%i" 
02.
echo %groesse:~-16%
Grüße
bastla
Mitglied: pbelcl
pbelcl schreibt am 11.02.2012 um 09:19:39 Uhr
Hallo bastla,

Klar auf die Lösung hätt ich auch selber kommen können.
Danke dass du mir immer wieder hilfst im Wald die Bäume zu sehen face-wink

Hat übrigens geklappt, habs gereits eingebaut....
lg
Paul
PS: Seid ihr hier eigentlich daran interessiert das gesamte "Projekt" als Demobeispiel zu haben?
Wenn ja wohin soll ich's posten?
Mitglied: bastla
bastla schreibt am 11.02.2012 um 21:03:38 Uhr
Hallo pbelcl!

Freut mich, wenn's passt ... face-smile

Seid ihr hier eigentlich daran interessiert das gesamte "Projekt" als Demobeispiel zu haben?
Kann ja nicht schaden ... face-wink
Wenn ja wohin soll ich's posten?
Wenn Du es entsprechend erklärst und kommentierst könnte das ein Tipp oder eine Anleitung (natürlich hier unter "Batch & Shell") werden ...

Grüße
bastla
Mitglied: pbelcl
pbelcl schreibt am 12.02.2012 um 07:56:30 Uhr
Na dann probier ich's mal hier:

1.) Ich hab mir vor einiger Zeit ein universelles Backuptool geschrieben welches mit 4 Parametern beschickt wird. Dieses Tool macht Nachts immer Datensicherung mit Robocopy auf eine Sicherungsplatte.
2.) Habe ich dieses Tool unlängst um 2 Funktionen erweitert.
2a.) Die vielen unterschiedlichen Festplatten "wissen" was auf ihnen gesichert werden soll
2b.) Das tool schreibt eine Logdatei was gesichert wird und informiert mich per Email wenn was schief läuft.

01.
@echo off 
02.
cls 
03.
 
04.
rem hier werden die Variablen übergeben... 
05.
set "Z_LW=%~1"  
06.
set "Z_V=%~2" 
07.
set "Q_LW=%~3" 
08.
set "Q_V=%~4" 
09.
set "Z_V1= 
10.
if "%Z_V:~-1%"==" " set "Z_V1=%Z_V:~,-1%"  
11.
if not "%Z_V:~-1%"==" " set "Z_V1=%Z_V%" 
12.
echo. 
13.
 
14.
:var_pruef 
15.
rem hier wird geprüft ob die Variablen auch alle gefüllt sind 
16.
call %Workdir%\time_set silent 
17.
rem Timeset schreibt das Datum und die Zeit in die Variable %Zeitstempel%, wird fürs LOG gebraucht!! 
18.
if "X%Q_LW%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler 
19.
rem diese Prüfung deaktiviert, damit man auch ganze Laufwerke ohne Ordner kopieren kann 
20.
rem if "X%Q_V%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler 
21.
if "X%Z_LW%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler 
22.
if "X%Z_V%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler 
23.
rem prüft ob Ziellaufwerk existiert... 
24.
if not exist %Z_LW% set meldung=Ziel-Laufwerk %Z_LW% existiert nicht&goto Fehler 
25.
rem Prüft ob auf dem Ziellaufwerk auch eine Sicherungsliste ist! 
26.
if exist %Z_LW%\sicherungsliste.txt set LOGFILE="%Z_LW%\%VOLBEZ%.log" 
27.
if not exist %Z_LW%\sicherungsliste.txt set LOGFILE="%WORKDIR%\Backup\%~n0.log" 
28.
if not exist "%Z_LW%\%Z_V%" goto Z_V_fehler 
29.
goto kopieren 
30.
 
31.
:Z_V_fehler 
32.
rem erstellt Zielordner falls nicht vorhanden... 
33.
echo Auf dem Laufwerk %Z_LW% ist kein Ordner: %Z_V% zu finden! 
34.
echo. 
35.
echo Ordner %Z_LW%\%Z_V% wird erstellt, OK ??  
36.
call ping localhost -n 4 >NUL 
37.
if not exist "%Z_LW%\%Z_V%" md "%Z_LW%\%Z_V%" 
38.
goto kopieren 
39.
 
40.
:kopieren 
41.
rem hier wird kopiert... 
42.
%utildir%\robocopy "%Q_LW%\%Q_V%" "%Z_LW%\%Z_V%" /COPY:DAT /R:1 /w:1 /FFT /TEE /NDL /NFL /mir /XO /NP /XD "System Volume Information" "$recycle.bin" "Recycler" "X_l”schen" /LOG+:%WORKDIR%\Backup\%~n0_%jahr%_%Monat%.log 
43.
if errorlevel 16 set Meldung=FEHLER: kritischer Fehler, abgebrochen !!!    & goto Fehler 
44.
if errorlevel 8  set Meldung=FEHLER: einige Dateien sind fehlerhaft !!!    & goto Fehler 
45.
if errorlevel 4  set Meldung=FEHLER: einige Dateien sind unterschiedlich   & goto Fehler 
46.
if errorlevel 2  set Meldung=Kopieren erfolgreich, Ziel-Dateien geloescht. & goto OK 
47.
if errorlevel 1  set Meldung=Kopieren erfolgeich.                          & goto OK 
48.
if errorlevel 0  set Meldung=keine veraenderten Dateien gefunden.          & goto OK 
49.
set Meldung=kein errorlevel zurückgegeben!	         & goto Fehler 
50.
 
51.
:OK 
52.
call %Workdir%\time_set silent 
53.
FOR /F "tokens=1 delims= " %%i in ('%utildir%\DIRUSE.EXE -s-m "%Z_LW%\%Z_V1%" ^|findstr "TOTAL"') do set "groesse=          %%i" 
54.
rem Diruse.exe ermittelt die gesicherte Größe am Ziel und schreibt sie in die Variamle %groesse% 
55.
echo %Zeitstempel% %meldung% %groesse:~-10% Megabyte   %Q_LW%\%Q_V% nach %Z_LW%\%Z_V% >>%LOGFILE% 
56.
echo %Q_LW%\%Q_V% kopiert - %meldung% 
57.
goto end 
58.
 
59.
:Fehler 
60.
call %Workdir%\time_set silent 
61.
echo  Fehler aufgetreten: 
62.
echo  in %~n0.bat  
63.
echo  %Meldung% 
64.
 
65.
echo Z_LW: %1  
66.
echo Z_V: %2  
67.
echo Q_LW: %3 
68.
echo Q_V: %4 
69.
call ping localhost -n 5 >NUL 
70.
echo. 
71.
FOR /F "tokens=1 delims= " %%i in ('%utildir%\DIRUSE.EXE -s-m "%Z_LW%\%Z_V1%" ^|findstr "TOTAL"') do set "groesse=          %%i" 
72.
echo %Zeitstempel% %meldung% %groesse:~-10% Megabyte   %Q_LW%\%Q_V% nach %Z_LW%\%Z_V% >>%LOGFILE% 
73.
rem gbmail schickt ein Email mit dem Fehler an eine gewünschte Emailadresse 
74.
%utildir%\gbmail -to max@mustermann.at -h smtp.mustermann.at -from %~n0@mustermann.at -s "%Zeitstempel% Backup von: %Q_LW%\%Q_V% nach %Z_LW%\%Z_V% meldet: %meldung%" 
75.
goto exit 
76.
 
77.
:end 
78.
echo fertig.... 
79.
:exit

Aufgerufen wird die Routine entweder sehr simpel durch diesen Befehl:

01.
Call %WorkDir%\Backup\BACKUP_Job.bat "%Z_LW%" "P\Daten" "P:" "Daten"

Oder über diesen Aufruf, wenn die Platte eine sicherungsliste.txt beinhaltet:
01.
@echo off 
02.
rem Sichert Daten auf eine externe Festplatte Y:\ 
03.
rem verwendet die sicherungsliste.txt auf der Zielplatte zur Auswahl der zu sichernden Ordner! 
04.
 
05.
if exist Y:\Sicherungsliste.txt set Z_LW=Y:&goto LW_OK 
06.
if not %1!==! set Z_LW=%1 
07.
if exist %Z_LW%\sicherungsliste.txt goto LW_OK 
08.
goto LW_Fehler 
09.
 
10.
:LW_OK 
11.
echo Ziellaufwerk: %Z_LW% 
12.
for /f "tokens=5*" %%i in ('vol %Z_LW% ^|findstr "Laufwerk"') do @set "Volbez=%%j" 
13.
call %Workdir%\time_set silent 
14.
rem hier wird das Backup Kernprogramm aufgerufen (siehe oben im Post) 
15.
For /F "eol=; delims=, tokens=1-2" %%i in (%Z_LW%\sicherungsliste.txt) do call %Workdir%\Backup\BACKUP_Job.bat "%Z_LW%" "%%i\%%j" "%%i:" "%%j" 
16.
goto end 
17.
 
18.
:LW_Fehler 
19.
echo Fehler in %~n0.bat aufgetreten:  
20.
echo kein Sicherungslaufwerk oder keine Sicherungsliste in %Z_LW% gefunden!! 
21.
pause 
22.
goto exit 
23.
 
24.
:end 
25.
echo fertig... 
26.
:exit

Die Textdatei "sicherungsliste.txt" sieht so aus:

p,
L,P_Fotos
L,P_Monatssicherung
L,P_Tagessicherung
V,1 - Videobibliothek/2 - Serien
V,1 - Videobibliothek/4 - Reportagen

Ich hoffe damit kann ich ein paar Ideen fördern face-wink

PS: Profis werden rausfinden dass die ganze Sache einen kleinen Schönheitsfehler hat!
Wenn ich ganze Laufwerke sichern möchte MUSS ich ein Leerzeichen nach dem Laufwerksbuchstaben angeben
> p,
sonst kommt mir Robocopy mit einem Fehler dass kein Ziellaufwerk existiert.

Dieses Leerzeichen muss ich dann im Backup Hauptprogramm für DIRUSAGE.EXE wieder entfernen da es sonst die Dateigröße nicht richtig bestimmen kann.
Deshalb gibt es im Hauptprgramm die Variable %Z_V% zweimal.
Das ist dieser Codeteil:
01.
set "Z_V1= 
02.
if "%Z_V:~-1%"==" " set "Z_V1=%Z_V:~,-1%"  
03.
if not "%Z_V:~-1%"==" " set "Z_V1=%Z_V%"

Sonst bin ich mit dem Ergebnis recht zufrieden face-wink
mehr ...Ähnliche Beiträge