jt-131
Goto Top

Ältere Dateien aus Verzeichnis protokolieren

Hallo zusammen,

Ich bräuchte eure Hilfe für eine Batch/Script.

Es ist so, dass automatisiert Textdateien in einen Ordner laufen und nach kurzer Zeit von einem anderen Programm eingelesen werden und aus dem Ordner somit gelöscht werden. Es kommt manchmal dazu, dass diese Dateien einen Fehler enthalten und manuell eingelesen werden müssen.

Gibt es eine Möglichkeit diesen Ordner zu durchsuchen sodass mit alle Dateien die älter als 30 Minuten sind in einer Logdatei gespeichert werden bzw. besser wäre es noch direkt die Log Datei per Mail zu versenden.

Ich habe mir gedacht, dass es eventuell mit einer von den folgenden Vorgehensweisen möglich sein muss dies zu realisieren, allerdings will es mir nicht gelingen.

Möglichkeit 1:

Mit dem Befehl "Dir >vorher.txt" die jetzigen Dateien in einer Textdatei zu speichern.
ping localhost -n 3000 um zu warten bis die Dateien normalerweise abgearbeitet sein müsste.
Jetzt wieder "Dir >nachher.txt" um den nachher Stand zu protokollieren.

Mit dem Befehl "fc vorher.txt nachher.txt >Compare.txt" vergleicht er mir die beiden Log-Dateien zwar, zeigt es mir aber so an, dass es unbrauchbar ist...

Möglichkeit 2:

Es wird der Zeitstempel der Datei (Erstelldatum) ausgelesen und mit einer vorher gespeicherten Zeit in einer variablen verglichen.
Ich weiß leider nicht wie ich das umsetzen kann.

Es wäre schön, wenn mir jemand hierbei helfen kann. Gibt es eventuell sogar fertige Programme um seine Ordner in dieser Hinsicht zu überprüfen?

Viele Grüße und danke im voraus für eure Hilfe oder Anregung! face-smile
JT

Content-ID: 206287

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

Ausgedruckt am: 22.11.2024 um 00:11 Uhr

bastla
bastla 10.05.2013 aktualisiert um 13:13:22 Uhr
Goto Top
Hallo JT-131!

Zu der Thematik gibt es einige Threads - etwa Datum - Uhrzeit einer Datei liegt x Zeit zurück ...

Was das Versenden per Mail angeht ist Dein Stichwort zB "blat" (siehe etwa auch im zweiten verlinkten Beitrag)

Grüße
bastla
Endoro
Endoro 10.05.2013 aktualisiert um 15:36:55 Uhr
Goto Top
Hallo JT-131,

dieses Script spuckt dir die Minuten seit Erstellung für alle Files im aktuellen Ordner aus:
@echo off &setlocal
set "fname="  
set "ftd="  
call:GetInternational
for /f "tokens=1-3*" %%a in ('dir /a-d /tc ^| findstr /b [0-9]') do set "ftd=%%a %%b"&set "fname=%%d"&call:process  
goto:eof

:process
rem Get file time:
set "fdate=%ftd:~0,10%"  
set "ftime=%ftd:~11%%sTime%00%sDecimal%00"  

call :GetSecs "%fdate%" "%ftime%" fileSecs  
call :GetSecs "%date%" "%time%" curSecs  
set /a elapsed="(curSecs-fileSecs)/60"  
echo %fname% ist %elapsed% Minuten alt.
goto :eof

:GetInternational
:: Sets a bundle of variables by reading the registry settings
for /f "tokens=1,2*" %%a in ('reg query "HKCU\Control Panel\International"') do set "%%a=%%c"  
goto :eof

:GetSecs "dateIn" "timeIn" secondsOut 
::  Output:  Seconds elapsed since 1th Jan. 1970 00:00:00
setlocal
set "dateIn=%~1"  
for /f "tokens=2" %%i in ("%dateIn%") do set "dateIn=%%i"  
for /f "tokens=1-3 delims=%sDate%" %%a in ("%dateIn%") do (  
  if %iDate%==0 set /a mm=100%%a%%100,dd=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==1 set /a dd=100%%a%%100,mm=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==2 set /a yy=10000%%a%%10000,mm=100%%b%%100,dd=100%%c%%100
)
for /f "tokens=1-3 delims=%sTime%%sDecimal% " %%a in ("%~2") do (  
  set "hh=%%a"  
  set "nn=%%b"  
  set "ss=%%c"  
)
if 1%hh% lss 20 set hh=0%hh%
if /i "%nn:~2,1%" equ "p" if "%hh%" neq "12" (set "hh=1%hh%" &set /a hh-=88)  
if /i "%nn:~2,1%" equ "a" if "%hh%" equ "12" set "hh=00"  
if /i "%nn:~2,1%" geq "a" set "nn=%nn:~0,2%"  
set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2,j=j/5+dd+y*365+y/4-y/100+y/400-2472633,j=j*86400+hh*3600+nn*60+ss
endlocal &set "%~3=%j%"  
goto :eof

endlocal

Gruss!
JT-131
JT-131 10.05.2013 aktualisiert um 16:10:00 Uhr
Goto Top
Hallo Endoro,

vielen Dank für dieses Script!
Ich habe es noch etwas angepasst und jetzt läuft es super.
Wer das Script auch benötigt muss nur die blat Dateien in %Quelle% ablegen und es funktioniert.

Danke auch an Bastla für den Tipp mit dem Blat!

Danke nochmals!

LG
JT


@echo off &setlocal
goto:Start
:Anfang
Timeout /T 120 /NOBREAK
:Start
set Ziel=C:\Test\
set Quelle=C:\Runtime\
del %Quelle%\log.txt
cd %Ziel%
set "fname="  
set "ftd="  
set Mail=0
call:GetInternational
for /f "tokens=1-3*" %%a in ('dir /a-d /tc ^| findstr /b [0-9]') do set "ftd=%%a %%b"&set "fname=%%d"&call:process  
goto:Mail
:Mail
if exist %Quelle%\Sperre.txt goto:Anfang Else goto:Mail1
rem Hier wird überprüft, ob bereits eine Mail zu diesem Fehler verschickt worden ist. Es muss nach einem Fehler manuell die Sperre.txt im %Quelle% Ordner gelöscht werden, ansonsten würdest du zugespammt werden.
:Mail1
cd %Quelle%
Blat -install Ordnerueberwachung Absender
Blat "C:\Runtime\log.txt" ^  
rem diese Datei mit alten Dateien wird als Nachricht an den Empfänger geschickt.
-to Empfänger -server xxx.xxx.xxx.xxx 
echo Sperre %date% %time% >%Quelle%\Sperre.txt
rem Hier wird die Sperre erzeugt, nachdem die Mail versand wurde.
cd %Ziel%
goto:Anfang

:process
rem Get file time:
set "fdate=%ftd:~0,10%"  
set "ftime=%ftd:~11%%sTime%00%sDecimal%00"  

call :GetSecs "%fdate%" "%ftime%" fileSecs  
call :GetSecs "%date%" "%time%" curSecs  
set /a elapsed="(curSecs-fileSecs)/60"  
echo %fname% ist %elapsed% Minuten alt.
if /I %elapsed% GEQ 10 call:Log
rem Die 10 Steht hier für 10 Minute alten Dateien
goto :eof
:Log
echo %fname% >>%Quelle%\log.txt
goto :eof

:GetInternational
:: Sets a bundle of variables by reading the registry settings
for /f "tokens=1,2*" %%a in ('reg query "HKCU\Control Panel\International"') do set "%%a=%%c"  
goto :eof

:GetSecs "dateIn" "timeIn" secondsOut 
::  Output:  Seconds elapsed since 1th Jan. 1970 00:00:00
setlocal
set "dateIn=%~1"  
for /f "tokens=2" %%i in ("%dateIn%") do set "dateIn=%%i"  
for /f "tokens=1-3 delims=%sDate%" %%a in ("%dateIn%") do (  
  if %iDate%==0 set /a mm=100%%a%%100,dd=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==1 set /a dd=100%%a%%100,mm=100%%b%%100,yy=10000%%c%%10000
  if %iDate%==2 set /a yy=10000%%a%%10000,mm=100%%b%%100,dd=100%%c%%100
)
for /f "tokens=1-3 delims=%sTime%%sDecimal% " %%a in ("%~2") do (  
  set "hh=%%a"  
  set "nn=%%b"  
  set "ss=%%c"  
)
if 1%hh% lss 20 set hh=0%hh%
if "%nn:~2,1%" equ "p" if "%hh%" neq "12" (set "hh=1%hh%" &set /a hh-=88)  
if "%nn:~2,1%" equ "a" if "%hh%" equ "12" set "hh=00"  
if "%nn:~2,1%" geq "a" set "nn=%nn:~0,2%"  
set /a hh=100%hh%%%100,nn=100%nn%%%100,ss=100%ss%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2,j=j/5+dd+y*365+y/4-y/100+y/400-2472633,j=j*86400+hh*3600+nn*60+ss
endlocal &set "%~3=%j%"  
goto :eof
endlocal