6741
Goto Top

neue Ordner auf FTP Server per Mail versenden

Hallo,

ich möchte einen FTP Server ( bzw den Pfad c:\ftp\ordner ) checken, ob es neue Ordner seit dem letzten Check gibt.

Diese dif soll dann per Mail versendet werden.

Der Befehl:

dir /s /b c:\ftp\ordner\*. > c:\ftpcheck\ftp_neu.txt

gibt mir nur den gesamten Ordner an.

Ich möchte aber eine dif Prüfung zum letzten Check machen.

Es kann in den Ordner c:\ftpcheck eine Datei abgelegt werden die den letzen Stand der Prüfung hat und diese müssten dann für den nächsten check geprüft werden.

Gruß

Content-ID: 72876

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

Ausgedruckt am: 07.11.2024 um 23:11 Uhr

bastla
bastla 07.11.2007 um 20:15:24 Uhr
Goto Top
Hallo firewalldevil!

Auf Basis eines Tutorials von Bitsqueezer (aber wieder in Batch) könnte ich folgende Variante zum Testen anbieten (das Versenden der Mail mit "blat.exe" ist nur angedeutet, aber bei Bedarf mehrfach hier im Forum nachzulesen):
@echo off & setlocal
set "LOGDIR=C:\ftp"  
set "MASK=*.*"  
set "LOGFILE=C:\ftpcheck\Log.txt"  
set "DIRFILE1=C:\ftpcheck\Content1.txt"  

set "DIRFILE2=%temp%\Content2.txt"  
set "LOGFILENEW=%temp%\LogNew.txt"  
set "LOGFILEDEL=%temp%\LogDel.txt"  

dir /s /b /ad /on "%LOGDIR%\%MASK%">"%DIRFILE2%" 2>nul  

if exist "%LOGFILENEW%" del "%LOGFILENEW%"  
if not exist "%DIRFILE1%" type "%DIRFILE2%">"%LOGFILENEW%" 2>nul & goto :Weiter  
for /f "usebackq delims=" %%i in ("%DIRFILE2%") do findstr /B /C:"%%i" "%DIRFILE1%"|findstr /E /C:"%%i">nul||echo %%i>>"%LOGFILENEW%"  

if exist "%LOGFILEDEL%" del "%LOGFILEDEL%"  
if not exist "%DIRFILE2%" type "%DIRFILE1%">"%LOGFILEDEL%" & goto :Weiter  
for /f "usebackq delims=" %%i in ("%DIRFILE1%") do findstr /B /C:"%%i" "%DIRFILE2%"|findstr /E /C:"%%i">nul||echo %%i>>"%LOGFILEDEL%"  

:Weiter
if exist "%DIRFILE2%" (move "%DIRFILE2%" "%DIRFILE1%") else (del "%DIRFILE1%" 2>nul)  

if exist "%LOGFILE%" del "%LOGFILE%"  
if exist "%LOGFILENEW%" echo Neue Verzeichnisse:>"%LOGFILE%" & type "%LOGFILENEW%">>"%LOGFILE%" & echo\>>"%LOGFILE%"  
if exist "%LOGFILEDEL%" echo Entfernte Verzeichnisse:>>"%LOGFILE%" & type "%LOGFILEDEL%">>"%LOGFILE%"  

if not exist "%LOGFILE%" goto :eof  
echo Mail mit "blat.exe" versenden ...  
type %LOGFILE%
Die Ausgabe des %LOGFILE%-Inhaltes dient nur Demozwecken (bzw wäre der Hauptteil des Mail-Body).

Grüße
bastla

[Edit] Fehlendes (zweites) Umleitungszeichen ergänzt. [/Edit]
6741
6741 07.11.2007 um 20:36:33 Uhr
Goto Top
hi bastla ...

sieht sehr gut aus .... aber ( schitt es kommt immer ein aber .... ;>) )

habe ich zb

c:\ftp\ordner1\neu1
c:\ftp\ordner1\neu2
c:\ftp\ordner2\neu1

werden die Unterordner nicht durchsucht ( einer ja, aber nicht beide ) ... hab ich evtl auch nicht gesagt, aber es wäre super wenn alle Ordner nach neuen Ordner durchsucht werden.

gruß
bastla
bastla 07.11.2007 um 21:17:24 Uhr
Goto Top
Hallo firewalldevil!

Da war mir doch tatsächlich ein ">" von der Schaufel gesprungen ...

... ich hab aber noch ein anderes gefunden und oben eingebaut. face-wink

Grüße
bastla
6741
6741 07.11.2007 um 21:23:55 Uhr
Goto Top
ich sach mal ....

vielen Dank ...

und respekt ....

gruß
6741
6741 08.11.2007 um 17:45:05 Uhr
Goto Top
Hi bastla,

die Überprüfung auf Laufwerksebene geht ja, super ...

Bezug auf den Titel ... also einen FTP Server auslesen, würde das sicher etwas anderes sein.

Jetzt liegen die Daten local auf einem Server der auch FTP Server ist ( Windows ) nutze ich aber einen nicht Windows Server als FTP muss ich mich mit einem Client anmelden.

Kann man dann den Inhalt des FTP Server mit Hilfe eine User auch komplett auslesen und vergleichen.

Hintergrund ist, dass ich die Daten bald auf ein kleines NAS Laufwerke ( 150€ ) legen möchte, welches dann immer an ist und halt auch FTP Server ist, aber nicht Windows.

Gruß
bastla
bastla 08.11.2007 um 18:19:43 Uhr
Goto Top
Hallo firewalldevil!

Eigentlich geht es dann nur um den Ersatz der Zeile
dir /s /b /ad /on "%LOGDIR%\%MASK%">"%DIRFILE2%" 2>nul  
zum Erstellen der Ordnerliste - der Rest könnte (unter Berücksichtigung der folgenden Anmerkung zur Technik des Vergleiches) grundsätzlich unverändert bleiben.
Wie werden die Listen verglichen?

Unter der Annahme, dass "findstr" Laufzeitvorteile gegenüber einer "for"-Schleife hat, wird wie folgt versucht, einen Ordnernamen in den gespeicherten Ergebnissen des letzten Durchlaufes zu finden:

Zunächst werden alle Einträge gesucht, deren Anfang exakt mit dem zu prüfenden Ordnernamen übereinstimmt.
In den daraus resultierenden Ergebnissen werden alle Einträge gesucht, deren Ende exakt mit dem zu prüfenden Ordnernamen übereinstimmt.
Jetzt kann das Ergebnis eigentlich nur noch ein oder kein Eintrag sein. Bleibt kein Eintrag über, muss der Ordner neu (bzw - mit vertauschten Listen - entfernt worden) sein.

Dies funktioniert gut, wenn (wie eben in Windows) davon ausgegangen werden kann, dass die Laufwerksangabe ("C:") nur am Anfang, nicht aber mitten in einem per "dir" ausgelesenen Ordnerpfad stehen kann.

Eine derartige Kennung müsste dann auch für die Darstellung der ftp-Ordner-Listings vorausgesetzt (oder erstellt) werden, da zB ein neu erstellter Ordner "alt" (ohne weitere Angabe, wie Laufwerk und/oder Pfad) nicht als neuer Ordner erkannt würde, wenn es bereits einen Ordner "alt und kalt" gäbe.

Grüße
bastla
6741
6741 20.01.2008 um 14:44:27 Uhr
Goto Top
noch mal nach gefragt ...

wenn ich den Ordner aufteilen möchte ..

zb für User1 und User2

und nur auf Userebene die Inhalte überprüfen möchte ...

________________________________

dir /s c:\ftp\user1\ > c:\ftpcheck\ftp_neu.txt

fc c:\ftpcheck\ftp_neu.txt c:\ftpcheck\ftp_alt.txt >nul && goto difcheck

:difcheck

fc ftp_neu.txt ftp_alt.txt >dif.txt

find /i "DIR" dif.txt >dif1.txt

find /v /i "<DIR> ." dif1.txt >dif2.txt

type dif2.txt|find /v /i "----------">dif3.txt

c:\ftpcheck\sendemail.exe -f ftpcheck@domain.de -t empfänger -u FTP_Update -s ausgangsserver -xu kontoname -xp kontokennwort -o message-file=c:\ftpcheck\dif3.txt

del ftp_alt.txt

rename ftp_neu.txt ftp_alt.txt

:ende

del dif.txt
del dif1.txt
del dif2.txt
del dif3.txt

pause

_____________________________________________________

es wird alles gecheckt ...

evtl ne Idee ...

gruß
bastla
bastla 20.01.2008 um 15:54:21 Uhr
Goto Top
Hallo firewalldevil!

Irgendwie sehe ich das Problem nicht ...

Wenn Du nicht den gesamten Ordner "C:\ftp", sondern nur den Ordner "C:\ftp\user1" (jeweils inklusive Unterordner) auf Veränderungen überprüfen willst, müsstest Du nur im oben geposteten Batch die erste "set"-Zeile anpassen, also
set "LOGDIR=C:\ftp\user1"  
schreiben (womit auch der eigentliche Sinn dieser Zeile erklärt wäre face-wink). Variabel bekommst Du das noch hin, wenn Du entweder eine Eingabe der Art
set /p "LOGDIR=Zu untersuchender Ordner? "  
verwendest oder den Batch mit dem entsprechenden Ordner als Parameter aufrufst:
set "LOGDIR=~1"  
Natürlich kannst Du auch eine Kombination der Methoden vornehmen, etwa:
set "LOGDIR=C:\ftp"  
if [%1] neq  set "LOGDIR=~1"  
etc.

Grüße
bastla
6741
6741 20.01.2008 um 18:57:02 Uhr
Goto Top
upps i did it again ...

falsche batch ...

jetzt geht´s ..

ich feile noch, wenn ich die Log´s protokollieren möchte würde ich sie gerne verschieben...

sprich ..

copy log.txt c:\ftpcheck\logs klappt auch, aber ein

rename c:\ftpcheck\logs\log.txt log%date%%time%.txt

gibt ein syntaxfehler ...

warum kann rename nicht mit date und time umgehen?

gruß
bastla
bastla 20.01.2008 um 19:41:20 Uhr
Goto Top
Hallo firewalldevil!

warum kann rename nicht mit date und time umgehen?
Die Antwort findest Du sehr schnell, wenn Du vor Deine Zeile ein "echo" schreibst:
echo rename c:\ftpcheck\logs\log.txt log%date%%time%.txt 

So sollte es gehen:
ren c:\ftpcheck\logs\log.txt log%date:~-4%%date:~-7,2%%date:~-10,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt
Diese etwas aufwändige Schreibweise hat aus meiner Sicht zwei Vorteile:

Wenn das Datum vom Ende her aufgelöst wird, fällt der Unterschied zwischen W2000 einerseits und den OS-Versionen ab XP andererseits weg, und außerdem ist die Reihenfolge JJJJMMTT übersichtlicher.

Grüße
bastla
6741
6741 20.01.2008 um 20:04:56 Uhr
Goto Top
oh das sieht nicht gut aus ....

danke ....

gruß