6741
06.11.2007, aktualisiert am 20.01.2008
5141
11
0
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ß
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ß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 72876
Url: https://administrator.de/contentid/72876
Ausgedruckt am: 07.11.2024 um 23:11 Uhr
11 Kommentare
Neuester Kommentar
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):
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]
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%
Grüße
bastla
[Edit] Fehlendes (zweites) Umleitungszeichen ergänzt. [/Edit]
Hallo firewalldevil!
Eigentlich geht es dann nur um den Ersatz der Zeile
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
Eigentlich geht es dann nur um den Ersatz der Zeile
dir /s /b /ad /on "%LOGDIR%\%MASK%">"%DIRFILE2%" 2>nul
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
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
schreiben (womit auch der eigentliche Sinn dieser Zeile erklärt wäre ). Variabel bekommst Du das noch hin, wenn Du entweder eine Eingabe der Art
verwendest oder den Batch mit dem entsprechenden Ordner als Parameter aufrufst:
Natürlich kannst Du auch eine Kombination der Methoden vornehmen, etwa:
etc.
Grüße
bastla
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"
set /p "LOGDIR=Zu untersuchender Ordner? "
set "LOGDIR=~1"
set "LOGDIR=C:\ftp"
if [%1] neq set "LOGDIR=~1"
Grüße
bastla
Hallo firewalldevil!
So sollte es gehen:
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
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
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