LogWert/logwert.cmd
2019-09-17 14:59:34 +02:00

236 lines
7.4 KiB
Batchfile
Raw Blame History

@echo off
setlocal enabledelayedexpansion
rem ##############################################################
rem ## ##
rem ## logwert.cmd version. 1.2 ##
rem ## ##
rem ## Dies ist ein Hilfsscript fuer _shares_spiegeln.bat ##
rem ## Es wertet die Robologfile aus und fast diese zusammen ##
rem ## ##
rem ## @param %1 Pfadangabe-Logdatei ##
rem ## ##
rem ## @author: Martin.Huber@stbaro.bayern.de ##
rem ## ##
rem ##############################################################
rem Einstellungen
rem Dividierender Faktor der Groe<6F>enausgabe (GB=1073741824,...)
set Log_Copy_Size_Einheit=1073741824
rem ##########################################################################################
rem ########################### Beginn des eigendlichen Programms ############################
rem ##########################################################################################
rem
rem Hilfsvariablen NICHT editieren
rem
set Log_Path=%1
set Log_Copy_errors=0
set Log_Copy_Size=0
set Log_Copy_real_Size=0
set Log_Copy_item=0
set Log_Copy_real_item=0
rem ##########################################################################################
:Start
rem pruefen ob auszuwertendes Logfile Existiert
if not exist "%Log_Path%" set errorlevel=1&echo Wrong Log Path&goto exit
for /f "delims=# tokens=3" %%c in ('echo %random%') do call :WichCase Dauer xy
rem Logfile Auswerten
rem Jede Zeile mit !!!MAIN!!! einzeln Auswerten
for /f "tokens=*" %%a in (%Log_Path%) do call :Main %%a
rem Umrechnen und Runden der Gr<47><72>enausgabe
call :calc "%Log_Copy_Size%/%Log_Copy_Size_Einheit%" Log_Copy_Size
set result=
call :round %Log_Copy_Size%
set Log_Copy_Size=%result%
call :calc "%Log_Copy_real_Size%/%Log_Copy_Size_Einheit%" Log_Copy_real_Size
set result=
call :round %Log_Copy_real_Size%
set Log_Copy_real_Size=%result%
echo Insgesamt: %Log_Copy_real_item% von %Log_Copy_item% Dateien kopiert, %Log_Copy_errors% Fehler, %Log_Copy_real_Size% g von %Log_Copy_Size% g kopiert
set "result=%Log_Copy_real_item% von %Log_Copy_item% Dateien kopiert, %Log_Copy_errors% Fehler, %Log_Copy_real_Size% g von %Log_Copy_Size% g kopiert"
rem bis drei stellen nach dem komma
rem 4 ziffern
rem g
goto Exit
Rem ############################################################################################
Rem Zeilenweise Auswertung
:Main
set Log_Line=%*
Rem Entfernen Problematischer Zeichen und setzen des Trennzeichens (#)
set Log_Line=%Log_Line:"=#%
set Log_Line=%Log_Line:,=#%
set Log_Line=%Log_Line:)=+%
set Log_Line=%Log_Line:(=+%
rem Abschnitte einzeln weiter Auswerten
for /f "delims=# tokens=2" %%b in ('echo %Log_Line%') do (
set tempvar=%%b
call :WichCase !tempvar!
)
for /f "delims=# tokens=3" %%c in ('echo %Log_Line%') do call :WichCase %%c
for /f "delims=# tokens=4" %%d in ('echo %Log_Line%') do call :WichCase %%d
for /f "delims=# tokens=5" %%e in ('echo %Log_Line%') do call :WichCase %%e
goto Exit
Rem ##################################################################################################
:WichCase
Rem herausfinden der Informations Art (Item, Error, Size)
rem und starten der zugehoerigen auswerte Funktion
set var_a=%*
if not defined var_a goto exit
Rem Lehre Ordner werden so uebersprungen
for /f "tokens=1" %%g in ('echo !var_a!') do if "%%g" == "Dauer" goto exit
rem zaehlen der Dateien
for /f "tokens=1,3,4" %%h in ('echo !var_a!') do if "%%j" == "Dateien" (
call :calc "%Log_Copy_item%+%%i" Log_Copy_item
call :calc "%Log_Copy_real_item%+%%h" Log_Copy_real_item
goto exit
)
rem zaehlen der Fehler
for /f "tokens=1,2" %%i in ('echo !var_a!') do if "%%j" == "Fehler" (
call :calc "%Log_Copy_errors%+%%i" Log_Copy_errors
goto exit
)
rem aufrufen der additions Funktion der Groe<6F>enangaben
for /f "tokens=1,2,4,5,6" %%k in ('echo !var_a!') do if "%%o" == "kopiert" (
call :count_real_Size %%k %%l
call :count_Size %%m %%n
goto exit
)
goto exit
rem ###############################################################################################
Rem erstellen aehnlicher Funktionen um "setlocal enabledelayedexpansion" zu Umgehen
:count_real_Size
set result=
call :convert_to_bytes %1 %2 result
call :calc "%result%+%Log_Copy_real_Size%" Log_Copy_real_Size
goto exit
:count_Size
set result=
call :convert_to_bytes %1 %2 result
call :calc "%result%+%Log_Copy_Size%" Log_Copy_Size
goto exit
rem ##############################################################################################
rem konfertieren der unterschiedlichen Groe<6F>enangaben in bytes (umrechnungseinheit= 1024)
rem b (=Bytes), k (=Kilobytes), m (=Megabytes), g (=Gigabytes) und t (=Terabytes)
:convert_to_bytes
rem convert_to_bytes [zahl] [einheit] (r<>ckgabe-variable)
set convert_to_bytes_zahl=%1
set convert_to_bytes_einheit=%2
set convert_to_bytes_var=%3
if not defined convert_to_bytes_var set convert_to_bytes_var=result
rem "Select Case convert_to_bytes_einheit"
goto :convert_to_bytes_%convert_to_bytes_einheit%
:convert_to_bytes_b
set %convert_to_bytes_var%=%convert_to_bytes_zahl%
goto exit
:convert_to_bytes_k
call :calc "%convert_to_bytes_zahl%*1024" %convert_to_bytes_var%
goto exit
:convert_to_bytes_m
call :calc "%convert_to_bytes_zahl%*1048576" %convert_to_bytes_var%
goto exit
:convert_to_bytes_g
call :calc "%convert_to_bytes_zahl%*1073741824" %convert_to_bytes_var%
goto exit
:convert_to_bytes_t
call :calc "%convert_to_bytes_zahl%*1099511627776" %convert_to_bytes_var%
goto exit
:convert_to_bytes_0
echo Kein Sharezugriff!
set %convert_to_bytes_var%=0
goto exit
rem ###############################################################################################
rem auslagern der Rechenfunktion in die PowerShell
:calc
rem calc ["berechnung"] (r<>ckgabe-variable)
set result=%1
if not defined result goto exit
rem herausfiltern unerlaubter Zeichen
set result=%result:,=.%
set result=%result:(=^(%
set result=%result:)=^)%
set result=%result:"=%
set result=%result:[=^(%
set result=%result:]=^)%
set var_name=%2
if not defined var_name set var_name=result
for /f %%a in ('powershell -C "%result%"') do set result=%%a
set result=%result:,=.%
set %var_name%=%result%
goto exit
rem #############################################################################################
rem die Funktion round konnte nicht in die PowerShell ausgelagert werden,
rem da der befehl Klammern enth<74>llt!
rem Rundet immer auf zwei Stellen nach dem Komma
:round
rem round [zahl]
set result=%*
if not defined result goto exit
set result=%result:,=.%
set result=%result:"=%
call :calc "%result%*1000" result
set result=%result:.=#%
set result=%result:,=#%
for /f "delims=# tokens=1" %%a in ('echo %result%') do set result=%%a
set last_number=%result:~-1%
if "%last_number%" GTR "5" (set round_zahl=1) else (set round_zahl=0)
call :calc "%result:~,-1%+%round_zahl%" result
call :calc "%result%/100" result
set last_number=
set round_zahl=
goto exit
rem #############################################################################################
:exit