l-unix
Goto Top

FTP Datum mit lokalem Datum abgleichen

Hallo Leutz!
Ich habe folgende Herausforderung zu bewaeltigen.

Ich habe ein FTP-Script erstellt, welches mir mit Hilfe des DIR-Befehls eine Verzeichnisliste vom FTP holt und in eine Logdatei (connect.log) schreibt. Nun muss ich ueberpruefen, ob Dateien auf dem FTP-Server liegen. Das ist kein Problem, ich ueberpruefe das Log-File auf den Namen jeweiligen der Datei. Nun ist allerdings ein Problem aufgetreten das ich nicht geloest bekomme.

Das Problem wurde zwar im Forum schon einmal aufgegriffen allerdings nicht in dieser Form.
https://www.administrator.de/index.php?content=57137

Das Problem:

Mit dem DIR-Befehl bekomme ich ja eine Uebersicht der gesamten Verzeichnisstruktur z.B. vom Ordner "share". In diesem werden Tag fuer Tag neue Dateien abgelegt. Der DIR-Befehl gibt zwar das Datum mit an allerdings in der Form "<UHRZEIT> <13> <Aug>". Lokal (unter Windows) gibt %date% /t allerdings "13.08.2009" aus.

Meine Frage daher.

Wie kann ich das FTP-Datum (welches in connect.log steht) mit dem lokalen Datum vergleichen.

Ich habe mir dazu schon einige Gedanken gemacht, allerdings komme ich damit zu keinem Erfolg und wirklich gut ist es auch nicht.
Hier meine bat:

@echo off
FOR /F "tokens=2,3,4 delims= " %%i IN (C:\scripts\autorating\RC2\getjob.log) DO (
if "%%j"=="Jan" echo %date:~-7,2%
if "%%j"=="Feb" echo %date:~-7,2%
if "%%j"=="Mar" echo %date:~-7,2%
if "%%j"=="Apr" echo %date:~-7,2%
if "%%j"=="May" echo %date:~-7,2%
if "%%j"=="Jun" echo %date:~-7,2%
if "%%j"=="Jul" echo %date:~-7,2%
if "%%j"=="Aug" echo %date:~-7,2%
if "%%j"=="Sep" echo %date:~-7,2%
if "%%j"=="Oct" echo %date:~-7,2%
if "%%j"=="Nov" echo %date:~-7,2%
if "%%j"=="Dec" echo %date:~-7,2%
REM if "%%j"=="" echo Schrott
)
FOR /F "tokens=3,4,5 delims= " %%j IN (C:\scripts\autorating\RC2\getjob.log) DO (
if "%%k"=="1" echo %date:~-10,2%
if "%%k"=="2" echo %date:~-10,2%
if "%%k"=="3" echo %date:~-10,2%
if "%%k"=="4" echo %date:~-10,2%
if "%%k"=="5" echo %date:~-10,2%
if "%%k"=="6" echo %date:~-10,2%
if "%%k"=="7" echo %date:~-10,2%
if "%%k"=="8" echo %date:~-10,2%
if "%%k"=="9" echo %date:~-10,2%
if "%%k"=="10" echo %date:~-10,2%
if "%%k"=="11" echo %date:~-10,2%
if "%%k"=="12" echo %date:~-10,2%
if "%%k"=="13" echo %date:~-10,2%
if "%%k"=="14" echo %date:~-10,2%
if "%%k"=="15" echo %date:~-10,2%
if "%%k"=="16" echo %date:~-10,2%
if "%%k"=="17" echo %date:~-10,2%
if "%%k"=="18" echo %date:~-10,2%
if "%%k"=="19" echo %date:~-10,2%
if "%%k"=="20" echo %date:~-10,2%
if "%%k"=="21" echo %date:~-10,2%
if "%%k"=="22" echo %date:~-10,2%
if "%%k"=="23" echo %date:~-10,2%
if "%%k"=="24" echo %date:~-10,2%
if "%%k"=="25" echo %date:~-10,2%
if "%%k"=="26" echo %date:~-10,2%
if "%%k"=="27" echo %date:~-10,2%
if "%%k"=="28" echo %date:~-10,2%
if "%%k"=="29" echo %date:~-10,2%
if "%%k"=="30" echo %date:~-10,2%
if "%%k"=="31" echo %date:~-10,2%
REM if "%%k"=="" echo Schrott
)

pause

Ich hoffe ihr koennt mir bei dem Problem helfen.

Gruß Steven

Content-ID: 122656

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

Ausgedruckt am: 25.11.2024 um 05:11 Uhr

bastla
bastla 13.08.2009 um 10:24:07 Uhr
Goto Top
Hallo L-UniX!

Könntest Du bitte eine Beispielzeile aus "getjob.log" posten?

Wie soll übrigens die Verarbeitung nach dem Datumsvergleich weitergehen?

Grüße
bastla
L-UniX
L-UniX 13.08.2009 um 10:34:56 Uhr
Goto Top
Hallo bastla,

hier der Inhalt von "getjob.log":
0,02Sekunden 4,25KB/s

hergestellt.

[::ffff:10.10.5.184]
list file connection for
test.cdr.job
07:38 Aug 13
0,02Sekunden 4,31KB/s


Wenn ich das Datum habe und der Vergleich mit dem lokalen Datum vollzogen wurde,
wollte ich die Datei vom FTP per mget oder wget abholen und auf dem lokalen Datentraeger speichern.

hier noch die connect.log:
ftp> Verbindung mit 10.10.5.184 wurde hergestellt.

open 10.10.5.184
220 ProFTPD 1.3.2 Server (ProFTPD) [::ffff:10.10.5.184]
Benutzer (10.10.5.184face-sadnone)):
331 Password required for nobody

230 User nobody logged in
ftp> dir /jobout/
200 PORT command successful
150 Opening ASCII mode data connection for file list
-rw-r--r-- 1 0 0 0 Aug 10 07:38 test.cdr.job

226 Transfer complete
FTP: 64d Bytes empfangen in 0,00Sekunden 69000,00KB/s

ftp> dir /cdr/
200 PORT command successful
150 Opening ASCII mode data connection for file list
-rw-r--r-- 1 root root 0 Aug 10 07:38 test.cdr.gz

226 Transfer complete
FTP: 64d Bytes empfangen in 0,00Sekunden 68000,00KB/s

ftp> quit
221 Goodbye.

Wenn du noch meine ftp.bat sehen moechtest, die kann ich bei Bedarf auch noch anhaengen.
Ich denke zur Abfrage des Datums wuerde sich wohl die connect.log eher bevorzugen, da dort das Datum
samt Datei in einer Zeile steht.

Gruß Steven
bastla
bastla 13.08.2009 um 10:46:15 Uhr
Goto Top
Hallo L-Unix!

Eine gleich bleibende Struktur (Datum steht in Zeile 7) der "getjob.log" vorausgesetzt, könnte das etwa so gehen:
@echo off & setlocal
set "Jan=01"  
set "Feb=02"  
set "Mar=03"  
set "Apr=04"  
set "May=05"  
set "Jun=06"  
set "Jul=07"  
set "Aug=08"  
set "Sep=09"  
set "Okt=10"  
set "Nov=11"  
set "Dec=12"  

set "Done="  
set "Mon="  
for /f "skip=6 tokens=2-3" %%i in (C:\scripts\autorating\RC2\getjob.log) do if not defined Done set Done=True & set "Tag=10%%j" & call set "Mon=%%%%i%%"  
if not defined Mon echo Schrott & goto :eof

set "DatumFTP=%Mon%%Tag:~-2%  
set "DatumLokal=%date:~-7,2%%date:~-10,2%"  

echo FTP:%DatumFTP% Lokal:%DatumLokal%
::Abfragebeispiel
if %DatumFTP% lss %DatumLokal% echo FTP-File ist alt
Grüße
bastla
L-UniX
L-UniX 13.08.2009 um 11:04:52 Uhr
Goto Top
Hallo bastla,

erstmal ein großes Danke fuer deine Hilfe!
Ich kann das obige Script jetzt noch nicht testen, da ich einen Termin
im RZ wahrnehmen muss. Aber sobald ich wieder im Hause bin teste ich das Script durch.

Heute Abend oder spaetestens morgen frueh gebe ich eine Rueckmeldung.

Gruß und Vielen Dank nochmals!

Steven
stbewo
stbewo 13.08.2009 um 12:48:57 Uhr
Goto Top
Hallo bastla,

ich saach nur Hut ab "bastla". Ich bin zwar nicht ganz unbefleckt im "batchen" aber von Dir kann man noch immer was lernen face-wink


Gruß
Stefan
bastla
bastla 13.08.2009 um 14:17:53 Uhr
Goto Top
@Stefan
Vielen Dank für die Blumen face-smile - werde ich postwendend an Biber weiterreichen ...

Grüße
bastla
L-UniX
L-UniX 13.08.2009 um 15:37:19 Uhr
Goto Top
Hallo bastla,

das Script funktioniert wunderbar ;) Maechtig großen Dank fuer die Hilfe.
Ich habe nur noch eine Frage.

Besteht die Moeglichkeit den Datumsvergleich auch fuer mehrere Dateien zu realisieren?
Also wenn jetzt im getjob.log zwei Eintraege von Dateien sind?

Beispiel:
0,02Sekunden 4,25KB/s
hergestellt.

[::ffff:10.10.5.184]
list file connection for
test.cdr.job 07:38 Aug 12
test2.cdr.job 07:09 Aug 13
0,02Sekunden 4,31KB/s

Koennte man die Abfrage auch auf mehrere Dateien ausweiten?

Gruß Steven

PS: Ich setze den Beitrag schon mal auf geloest. ;)
bastla
bastla 13.08.2009 um 16:01:21 Uhr
Goto Top
Hallo L-UniX!

Soferne die entsprechenden Zeilen herausgefiltert werden können (zB anhand des Suchbegriffs ".cdr.job"), dann etwa so:
@echo off & setlocal
set "Suche=\.cdr\.job"  

set "Jan=01"  
set "Feb=02"  
set "Mar=03"  
set "Apr=04"  
set "May=05"  
set "Jun=06"  
set "Jul=07"  
set "Aug=08"  
set "Sep=09"  
set "Okt=10"  
set "Nov=11"  
set "Dec=12"  

set "Mon="  
for /f "delims=" %%a in ('findstr /i "%Suche%" C:\scripts\autorating\RC2\getjob.log') do call :ProcessFile "%%a"  
goto :eof

:ProcessFile
set "Mon="  
for /f "tokens=1,3-4" %%i in (%1) do set "File=%%i" & set "Tag=10%%k" & call set "Mon=%%%%j%%"  
if not defined Mon echo Schrott & goto :eof

set "DatumFTP=%Mon%%Tag:~-2%  
set "DatumLokal=%date:~-7,2%%date:~-10,2%"  

echo %File% FTP:%DatumFTP% Lokal:%DatumLokal%
::Abfragebeispiel 
if %DatumFTP% lss %DatumLokal% echo FTP-File "%File%" ist alt  
goto :eof
Zu beachten wäre, dass im Suchbegriff der Punkt durch einen vorangestellten "\" maskiert ist, da er ansonsten als "beliebiges Zeichen" (was hier auch kein Beinbruch wäre) interpretiert würde.

Eine wichtige Einschränkung betrifft die Dateinamen: Diese dürfen kein Leerzeichen enthalten, da ansonsten die "token"-Zuordnung nicht mehr stimmt.

Grüße
bastla
L-UniX
L-UniX 13.08.2009 um 17:38:28 Uhr
Goto Top
Hallo bastla,

das Script funktioniert.
Aber ich muss doch nochmal was fragen. Wenn ich in der getjob.log den Dateinamen nicht an Position 1, sondern an Position 4 stehen habe, dann scheint das Script nicht mehr zu funktionieren.

Beispiel:
0,02Sekunden 4,25KB/s
hergestellt.

[::ffff:10.10.5.184]
list file connection for
07:38 Aug 12 test.cdr.job
07:09 Aug 13 test2.cdr.job
0,02Sekunden 4,31KB/s

Die Variable %Tag% wird dann nicht mehr korrekt ausgelesen. Ich habe schon versucht die Zaehlvariablen anzupassen, allerdings kommt dann bei %Tag% nur %10 heraus.

Muss ich nun darauf achten das der Dateiname immer am Anfang steht? Oder kann man das nachhaltig aendern?

Gruß

Steven
bastla
bastla 13.08.2009 um 18:23:43 Uhr
Goto Top
Hallo L-UniX!

Ändere die Zeile 23 auf
for /f "tokens=2-3*" %%i in (%1) do set "File=%%k" & set "Tag=10%%j" & call set "Mon=%%%%i%%"
Die jetzt (endgültige? face-wink) Reihenfolge hat den Vorteil, dass damit auch Dateinamen mit Leerzeichen richtig verarbeitet werden können.

Grüße
bastla
L-UniX
L-UniX 14.08.2009 um 09:02:04 Uhr
Goto Top
Morgen bastla,

wenn ich die Zeile 23 aendere, so wie du gesagt hast, dann erhalte ich einen Syntaxfehler.

Das Script gibt dann folgendes aus:
Aug FTP:"test1.cdr.job 07:38 Aug 11 Lokal:0814
Syntaxfehler.

Setze ich wiederrum "tokens=1,3-4*" dann gehts.

Allerdings nimmt er dann als %File% die erste Position in der Textdatei (getjob.log),
dann steht allerdings nicht der Dateiname dort, sondern die Uhrzeit.

Gruß
Steven
bastla
bastla 14.08.2009 um 10:57:51 Uhr
Goto Top
Hallo L-UniX!

Sorry, aber die Kombination Batch
@echo off & setlocal
set "Suche=\.cdr\.job"  

set "Jan=01"  
set "Feb=02"  
set "Mar=03"  
set "Apr=04"  
set "May=05"  
set "Jun=06"  
set "Jul=07"  
set "Aug=08"  
set "Sep=09"  
set "Okt=10"  
set "Nov=11"  
set "Dec=12"  

set "Mon="  
for /f "delims=" %%a in ('findstr /i "%Suche%" C:\scripts\autorating\RC2\getjob.log') do call :ProcessFile "%%a"  
goto :eof

:ProcessFile
set "Mon="  
for /f "tokens=2-3*" %%i in (%1) do set "File=%%k" & set "Tag=10%%j" & call set "Mon=%%%%i%%"  
if not defined Mon echo Schrott & goto :eof

set "DatumFTP=%Mon%%Tag:~-2%  
set "DatumLokal=%date:~-7,2%%date:~-10,2%"  

echo %File% FTP:%DatumFTP% Lokal:%DatumLokal%
::Abfragebeispiel 
if %DatumFTP% lss %DatumLokal% echo FTP-File "%File%" ist alt  
goto :eof
mit Daten "getjob.log"
0,02Sekunden 4,25KB/s
hergestellt.

[::ffff:10.10.5.184]
list file connection for
07:38 Aug 12 test.cdr.job
07:09 Aug 13 test2.cdr.job
0,02Sekunden 4,31KB/s
(beide eben nochmals heruntergeladen) funktioniert bei mir ...

Grüße
bastla
L-UniX
L-UniX 14.08.2009 um 11:38:52 Uhr
Goto Top
Hallo bastla,

jau jetzt gehts auch bei mir. ;)

Ich hatte beim Rumprobieren einen Tippfehler in der batch.
Aber nun geht alles.

Das Batch-Script habe ich etwas angepasst, da ich noch eine andere Logdatei habe, welche durchsucht wird. Und in dieser steht cdr.job an neunter Stelle, deswegen meine Frage. ;)

Jedenfalls nochmal vielen vielen Dank für deine Mühen, Hilfe, Unterstüzung und Geduld. :D

Grüße
Steven
60730
60730 15.08.2009 um 01:21:24 Uhr
Goto Top
naaabend zusammen
Zitat von @bastla:
Hallo L-UniX!

Wie soll übrigens die Verarbeitung nach dem Datumsvergleich weitergehen?

Zitat von @L-UniX:
Wenn ich das Datum habe und der Vergleich mit dem lokalen Datum
vollzogen wurde, wollte ich die Datei vom FTP per mget oder wget abholen und auf dem
lokalen Datentraeger speichern.

wget -n

Gruß
bastla
bastla 15.08.2009 um 07:45:42 Uhr
Goto Top
@timobeil
wget -n
... macht aber viel weniger Spaß ... face-wink

Grüße
bastla
60730
60730 15.08.2009 um 12:53:33 Uhr
Goto Top
Zitat von @bastla:
@timobeil
> wget -n
... macht aber viel weniger Spaß ... face-wink
@bastla
Threads mit dir machen immer Spass face-wink
Wobei ich dazu schreiben muß - ich hab viel von Dir & Biber gelernt und deswegen unterscheiden sich unsere Wege seitdem seltener.

Grüße
bastla

zurück face-wink
bastla
bastla 16.08.2009 um 10:19:31 Uhr
Goto Top
@timobeil
Threads mit dir machen immer Spass face-wink
Da ich den (meistens) habe, freut's mich umso mehr, wenn's Dir (und Anderen) auch so geht ... face-smile

ich hab viel von Dir & Biber gelernt
... sollte allerdings besser heißen: ich hab viel von Dir & (damit) Biber gelernt - so ziemlich alles, was über die Basics (Stichwort "command.com") hinausgeht, habe ich hier (und damit zum allergrößten Teil bei Biber) gefunden ...

Noch einen schönen Sonntag
bastla