pbelcl
Goto Top

Gesicherte Ordnergröße in Log schreiben

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

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

Content-Key: 180256

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: bastla
bastla 08.02.2012, aktualisiert am 18.10.2012 um 18:49:59 Uhr
Goto Top
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 08.02.2012, aktualisiert am 18.10.2012 um 18:49:59 Uhr
Goto Top
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 08.02.2012, aktualisiert am 18.10.2012 um 18:49:59 Uhr
Goto Top
Zitat von @bastla:
P.S.: Wir hätten da was ...
Tja, und damit hab ich es nun auch schon geschafft face-wink

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 08.02.2012 um 21:41:58 Uhr
Goto Top
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 08.02.2012 um 22:15:19 Uhr
Goto Top
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 09.02.2012 um 19:40:52 Uhr
Goto Top
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 09.02.2012 um 20:26:18 Uhr
Goto Top
Hallo pbelcl!

Etwa so:
if "%var:~-1%"==" " set "var=%var:~,-1%"
Grüße
bastla
Mitglied: pbelcl
pbelcl 10.02.2012 um 14:09:36 Uhr
Goto Top
> 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 ;-(

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 10.02.2012 um 14:47:11 Uhr
Goto Top
Hallo pbelcl!

Versuch es so:
FOR /F %%i in ('DIRUSE.EXE -s -m -, "p:\Software\" ^|findstr "TOTAL"') do set "groesse=                       %%i"  
echo %groesse:~-16%
Grüße
bastla
Mitglied: pbelcl
pbelcl 11.02.2012 um 09:19:39 Uhr
Goto Top
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 11.02.2012 um 21:03:38 Uhr
Goto Top
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 12.02.2012 um 07:56:30 Uhr
Goto Top
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.

@echo off
cls

rem hier werden die Variablen übergeben...
set "Z_LW=%~1"   
set "Z_V=%~2"  
set "Q_LW=%~3"  
set "Q_V=%~4"  
set "Z_V1=  
if "%Z_V:~-1%"==" " set "Z_V1=%Z_V:~,-1%"   
if not "%Z_V:~-1%"==" " set "Z_V1=%Z_V%"  
echo.

:var_pruef
rem hier wird geprüft ob die Variablen auch alle gefüllt sind
call %Workdir%\time_set silent
rem Timeset schreibt das Datum und die Zeit in die Variable %Zeitstempel%, wird fürs LOG gebraucht!!
if "X%Q_LW%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler  
rem diese Prüfung deaktiviert, damit man auch ganze Laufwerke ohne Ordner kopieren kann
rem if "X%Q_V%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler  
if "X%Z_LW%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler  
if "X%Z_V%X"=="XX" set Meldung=eine der vier Variablen ist leer !!!	& goto Fehler  
rem prüft ob Ziellaufwerk existiert...
if not exist %Z_LW% set meldung=Ziel-Laufwerk %Z_LW% existiert nicht&goto Fehler
rem Prüft ob auf dem Ziellaufwerk auch eine Sicherungsliste ist!
if exist %Z_LW%\sicherungsliste.txt set LOGFILE="%Z_LW%\%VOLBEZ%.log"  
if not exist %Z_LW%\sicherungsliste.txt set LOGFILE="%WORKDIR%\Backup\%~n0.log"  
if not exist "%Z_LW%\%Z_V%" goto Z_V_fehler  
goto kopieren

:Z_V_fehler
rem erstellt Zielordner falls nicht vorhanden...
echo Auf dem Laufwerk %Z_LW% ist kein Ordner: %Z_V% zu finden!
echo.
echo Ordner %Z_LW%\%Z_V% wird erstellt, OK ?? 
call ping localhost -n 4 >NUL
if not exist "%Z_LW%\%Z_V%" md "%Z_LW%\%Z_V%"  
goto kopieren

:kopieren
rem hier wird kopiert...
%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  
if errorlevel 16 set Meldung=FEHLER: kritischer Fehler, abgebrochen !!!    & goto Fehler
if errorlevel 8  set Meldung=FEHLER: einige Dateien sind fehlerhaft !!!    & goto Fehler
if errorlevel 4  set Meldung=FEHLER: einige Dateien sind unterschiedlich   & goto Fehler
if errorlevel 2  set Meldung=Kopieren erfolgreich, Ziel-Dateien geloescht. & goto OK
if errorlevel 1  set Meldung=Kopieren erfolgeich.                          & goto OK
if errorlevel 0  set Meldung=keine veraenderten Dateien gefunden.          & goto OK
set Meldung=kein errorlevel zurückgegeben!	         & goto Fehler

:OK
call %Workdir%\time_set silent
FOR /F "tokens=1 delims= " %%i in ('%utildir%\DIRUSE.EXE -s-m "%Z_LW%\%Z_V1%" ^|findstr "TOTAL"') do set "groesse=          %%i"  
rem Diruse.exe ermittelt die gesicherte Größe am Ziel und schreibt sie in die Variamle %groesse%
echo %Zeitstempel% %meldung% %groesse:~-10% Megabyte   %Q_LW%\%Q_V% nach %Z_LW%\%Z_V% >>%LOGFILE%
echo %Q_LW%\%Q_V% kopiert - %meldung%
goto end

:Fehler
call %Workdir%\time_set silent
echo  Fehler aufgetreten:
echo  in %~n0.bat 
echo  %Meldung%

echo Z_LW: %1 
echo Z_V: %2 
echo Q_LW: %3
echo Q_V: %4
call ping localhost -n 5 >NUL
echo.
FOR /F "tokens=1 delims= " %%i in ('%utildir%\DIRUSE.EXE -s-m "%Z_LW%\%Z_V1%" ^|findstr "TOTAL"') do set "groesse=          %%i"  
echo %Zeitstempel% %meldung% %groesse:~-10% Megabyte   %Q_LW%\%Q_V% nach %Z_LW%\%Z_V% >>%LOGFILE%
rem gbmail schickt ein Email mit dem Fehler an eine gewünschte Emailadresse
%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%"  
goto exit

:end
echo fertig....
:exit

Aufgerufen wird die Routine entweder sehr simpel durch diesen Befehl:

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

Oder über diesen Aufruf, wenn die Platte eine sicherungsliste.txt beinhaltet:
@echo off
rem Sichert Daten auf eine externe Festplatte Y:\
rem verwendet die sicherungsliste.txt auf der Zielplatte zur Auswahl der zu sichernden Ordner!

if exist Y:\Sicherungsliste.txt set Z_LW=Y:&goto LW_OK
if not %1!==! set Z_LW=%1
if exist %Z_LW%\sicherungsliste.txt goto LW_OK
goto LW_Fehler

:LW_OK
echo Ziellaufwerk: %Z_LW%
for /f "tokens=5*" %%i in ('vol %Z_LW% ^|findstr "Laufwerk"') do @set "Volbez=%%j"  
call %Workdir%\time_set silent
rem hier wird das Backup Kernprogramm aufgerufen (siehe oben im Post)
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"  
goto end

:LW_Fehler
echo Fehler in %~n0.bat aufgetreten: 
echo kein Sicherungslaufwerk oder keine Sicherungsliste in %Z_LW% gefunden!!
pause
goto exit

:end
echo fertig...
: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:
set "Z_V1=  
if "%Z_V:~-1%"==" " set "Z_V1=%Z_V:~,-1%"   
if not "%Z_V:~-1%"==" " set "Z_V1=%Z_V%"  

Sonst bin ich mit dem Ergebnis recht zufrieden face-wink