Status einer FTP übertragung in BATCH überprüfen
Guten Abend
Nach dem ich jetzt lange im WWW gesucht habe und nicht fündig wurde gelange ich an euch!
Ich habe ein Batch Script (WIN XP) das von einem FTP Server Files downloaded. Die funktioniert auch wunderbat aber es kann vorkommen,
dass auf dem Server die Files nicht vorhanden sind. In diesem Fall werden zwar lokal Files angelegt die aber leer sind. Das heisst auch file exist Test funktioniert nicht.
Ich suche eine Möglichkeit diesen Fall abzufangen und im Script eine entsprechende Meldung auszugeben. Leider habe ich bisher keine Möglichkeit gefunden
den Status des FTP Transfers abzufragen. Errorlevel setzt dies nicht.
Kann ich den Return Code der FTP Verbindung irgendwie abfragen oder gibt es beim FTP Aufruf eine Option damit keine Leerfile erstellt werden? Eventuell gibt es für
dieses Problem auch einen ganz anderen Ansatz.
Vielen Dank für eure Hilfe!
Gruss
Reto
Nach dem ich jetzt lange im WWW gesucht habe und nicht fündig wurde gelange ich an euch!
Ich habe ein Batch Script (WIN XP) das von einem FTP Server Files downloaded. Die funktioniert auch wunderbat aber es kann vorkommen,
dass auf dem Server die Files nicht vorhanden sind. In diesem Fall werden zwar lokal Files angelegt die aber leer sind. Das heisst auch file exist Test funktioniert nicht.
Ich suche eine Möglichkeit diesen Fall abzufangen und im Script eine entsprechende Meldung auszugeben. Leider habe ich bisher keine Möglichkeit gefunden
den Status des FTP Transfers abzufragen. Errorlevel setzt dies nicht.
Kann ich den Return Code der FTP Verbindung irgendwie abfragen oder gibt es beim FTP Aufruf eine Option damit keine Leerfile erstellt werden? Eventuell gibt es für
dieses Problem auch einen ganz anderen Ansatz.
Vielen Dank für eure Hilfe!
Gruss
Reto
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 90737
Url: https://administrator.de/contentid/90737
Ausgedruckt am: 19.11.2024 um 20:11 Uhr
11 Kommentare
Neuester Kommentar
Servus und Willkommen Reto.
Es hat sich als allgemein hilfreich erwiesen - bei Problemen mit Batchen aller Art die batch zwischen einzutragen, dann ist das mit dem "helfen" einfacher
Grundsätzlich kannst du mit
Eine Leere Datei "finden"
dazu brauchst du nur eine 0 Byte datei namens "leeredatei.dummy"
Idealerweise solltest du aber sicherstellen, daß der Download "wirklich" geklappt hat und da wäre dein Script ein besserer Ansatz zur Hilfe
Die Edith fragt die Profis - sagt mal wie macht Ihr das mit dem (code) (/code) in den Echten <> Klammern
und die Edith² sagt - wer lesen kann ist klar im Vorteil
Du willst leere Dateien löschen
dann drehen wir den Spiess doch um
Es hat sich als allgemein hilfreich erwiesen - bei Problemen mit Batchen aller Art die batch zwischen
Grundsätzlich kannst du mit
:startftp
ftp xyz123
FC /B "leeredatei.dummy" "Downloaddatei"
if %errorlevel% = 1 del /q "Downloaddatei"
dazu brauchst du nur eine 0 Byte datei namens "leeredatei.dummy"
Idealerweise solltest du aber sicherstellen, daß der Download "wirklich" geklappt hat und da wäre dein Script ein besserer Ansatz zur Hilfe
Die Edith fragt die Profis - sagt mal wie macht Ihr das mit dem (code) (/code) in den Echten <> Klammern
und die Edith² sagt - wer lesen kann ist klar im Vorteil
Du willst leere Dateien löschen
dann drehen wir den Spiess doch um
@timobeil
Anmerkung zu Zeile 5: Hier könntest Du entweder eine "echte" ERRORLEVEL-Abfrage (bedeutet immer ">=", siehe "if /?") mit
vornehmen oder tatsächlich den Variableninhalt prüfen, dann aber mit "==" oder "equ" (bzw, analog zu oben, mit "geq") vergleichen:
Die erste Variante bietet sich vor allem innerhalb von "for"-Schleifen an, da bei Variante 2 der Variablenwert (außer per "delayedExpansion") innerhalb der Schleife nicht ausgewertet werden kann.
Das "del" benötigt übrigens kein "/q", wenn nur eine einzelne Datei gelöscht werden soll.
Der Ansatz mit "fc" ist durchaus einfallsreich, aber eine gezielte Abfrage auf die Dateigröße in einer Schleife (speziell wenn es um mehrere Dateien geht) wäre vielleicht auch nicht so übel , zB
Grüße
bastla
Anmerkung zu Zeile 5: Hier könntest Du entweder eine "echte" ERRORLEVEL-Abfrage (bedeutet immer ">=", siehe "if /?") mit
if errorlevel 1 ...
if %errorlevel%==1 ...
Das "del" benötigt übrigens kein "/q", wenn nur eine einzelne Datei gelöscht werden soll.
Der Ansatz mit "fc" ist durchaus einfallsreich, aber eine gezielte Abfrage auf die Dateigröße in einer Schleife (speziell wenn es um mehrere Dateien geht) wäre vielleicht auch nicht so übel , zB
for %%i in ("D:\ftp-Downloads\*.txt") do if %%~zi equ 0 echo %%i ist leer
bastla
@ Bastla:
Das fehlen des zweiten = liegt an meiner [Edit] - da hab ich das schlicht überschreiben (als ich den Spieß umgedreht habe)
Das "del" scheib ich schon mechanisch "del /q"
Es macht mir immer wieder Spaß hier auch zu lernen, nicht nur Antworten zu geben - den da:
@ reto -ich ahnte es (ftp.exe) - da wir einen Proxy haben, kann ich das ftp.exe nicht benutzen für FTP Downloads mit User & pass nehme ich WSFTP - jedoch nchtdie freie (verlinkte), sondern eine "gekaufte Pro" - (ob in der freien das FTPsync dabei ist - bitte selber nachsehen)
In der .ctl steht Server, User, Password & Ordner usw. drin
WGet liefert mir auch ein log -das frage ich dann so ab:
Das fehlen des zweiten = liegt an meiner [Edit] - da hab ich das schlicht überschreiben (als ich den Spieß umgedreht habe)
Das "del" scheib ich schon mechanisch "del /q"
Es macht mir immer wieder Spaß hier auch zu lernen, nicht nur Antworten zu geben - den da:
do if %%~zi equ 0 echo %%i ist leer
kannte ich noch nicht - Schankedöhn vielmals @ reto -ich ahnte es (ftp.exe) - da wir einen Proxy haben, kann ich das ftp.exe nicht benutzen für FTP Downloads mit User & pass nehme ich WSFTP - jedoch nchtdie freie (verlinkte), sondern eine "gekaufte Pro" - (ob in der freien das FTPsync dabei ist - bitte selber nachsehen)
In der .ctl steht Server, User, Password & Ordner usw. drin
:start
ftpsync.exe %1.ctl
findstr /c:"Completed" %1.log
echo %errorlevel%
IF %ERRORLEVEL% GTR 0 goto start
IF %ERRORLEVEL% EQU 0 goto end
:end
WGet liefert mir auch ein log -das frage ich dann so ab:
find "is more recent, not retrieving." %1.log
Zitat von @bastla:
Der Ansatz mit "fc" ist durchaus einfallsreich, aber eine gezielte Abfrage auf die Dateigröße in einer
Schleife (speziell wenn es um mehrere Dateien geht) wäre vielleicht auch nicht so übel , zB
Der Ansatz mit "fc" ist durchaus einfallsreich, aber eine gezielte Abfrage auf die Dateigröße in einer
Schleife (speziell wenn es um mehrere Dateien geht) wäre vielleicht auch nicht so übel , zB
for %%i in ("D:\ftp-Downloads\*.txt") do if %%~zi equ 0 echo %%i ist leer
Hallo bastla,
versuche gerade dein Beispiel etwas umzuschreiben. Und zwar ziehe ich mir eine log-Datei mittels "dir" von einem FTP und möchte dann auf 0-Byte Dateien prüfen um diese anschließend vom FTP zu löschen.
Folgendes habe ich mir mal zusammengebastelt:
for /f "tokens=3" %%i in (%LASTLW%\ebt\test.log) do if %%i equ 0 echo del "%%i">>ftp.txt
habe dies jedoch noch nicht getestet, damit ich nicht aus Versehen was vom Server lösche.
Könnte das so funktionieren?
Grüße
Armin
Hallo mybusiness1987!
Grüße
bastla
habe dies jedoch noch nicht getestet, damit ich nicht aus Versehen was vom Server lösche.
Du erstellst damit ja zunächst eine "ftp.txt", die Du in aller Ruhe ansehen kannst (ohne sie gleich als Script-Datei an "ftp.exe" zu übergeben) - damit hast Du eigentlich schon eine Testmöglichkeit ...Grüße
bastla
Hallo,
ich versuche gerade das obere Codestück zum löschen von 0 Byte Dateien anzupassen, Und zwar so, dass er die Dateigröße in der log mit der Dateigröße in einem lokalen Verzeichnis vergleicht. Wenn diese nicht identisch ist, soll die Datei aus der log (also auf dem FTP) gelöscht werden.
Leider komme ich irgendwie zu keiner Lösung. habe folgendes probiert:
Hoffe ihr könnt mir wieder mal helfen.
Gruß Armin
ich versuche gerade das obere Codestück zum löschen von 0 Byte Dateien anzupassen, Und zwar so, dass er die Dateigröße in der log mit der Dateigröße in einem lokalen Verzeichnis vergleicht. Wenn diese nicht identisch ist, soll die Datei aus der log (also auf dem FTP) gelöscht werden.
Leider komme ich irgendwie zu keiner Lösung. habe folgendes probiert:
for /f "tokens=3*" %%i in (%LASTLW%\ebt\test.log) do if not "%LASTLW%\ebt\test\%%i" echo del "%%j">>ftp.txt
Hoffe ihr könnt mir wieder mal helfen.
Gruß Armin