bole06
Goto Top

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

Content-ID: 90737

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

Ausgedruckt am: 19.11.2024 um 20:11 Uhr

60730
60730 26.06.2008 um 17:32:14 Uhr
Goto Top
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 face-wink

Grundsätzlich kannst du mit
:startftp
ftp xyz123
FC /B "leeredatei.dummy" "Downloaddatei"  

if %errorlevel% = 1 del /q "Downloaddatei"  
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 face-wink

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 face-wink


dann drehen wir den Spiess doch um face-wink
bastla
bastla 26.06.2008 um 20:16:01 Uhr
Goto Top
@timobeil

Anmerkung zu Zeile 5: Hier könntest Du entweder eine "echte" ERRORLEVEL-Abfrage (bedeutet immer ">=", siehe "if /?") mit
if errorlevel 1 ...
vornehmen oder tatsächlich den Variableninhalt prüfen, dann aber mit "==" oder "equ" (bzw, analog zu oben, mit "geq") vergleichen:
if %errorlevel%==1 ...
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 face-wink, zB
for %%i in ("D:\ftp-Downloads\*.txt") do if %%~zi equ 0 echo %%i ist leer  
Grüße
bastla
bole06
bole06 27.06.2008 um 08:52:22 Uhr
Goto Top
Guten Morgen

Vielen Dank für die promte Hilfe! Mit dem Tipp des Filevergleichs mit einen leeren File kann ich mein Problem bereits lösen, jedoch würde es mich schon interessieren ob es nicht eine elegantere Lösung gibt den Status des FTP Transfers abzufragen.

Anbei noch mein Code:

echo File Transfer Down ausführen
echo --------------------------------------- 
:startFtp >> %down%
ftp -s":%down%  
:end

Im FTP File steht folgendes:
open XXXXXXXXXXX.net 
XXXXXXXXXX
XXXXXXXXX
ascii 
cd // 
lcd x:\Positons_File  
get position_all.txt position_4298_all.txt      
bye 

Da ich mein Problem bereits lösen kann ist die Frage nur zu meiner Weiterbildung... für eine Antwort Danke ich im vorraus, sie ist sicher aber nicht dringend....

Gruss

Reto
60730
60730 27.06.2008 um 11:34:30 Uhr
Goto Top
@ Bastla:

face-wink 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 face-wink

@ 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
mybusiness1987
mybusiness1987 08.08.2012 aktualisiert um 14:33:11 Uhr
Goto Top
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 face-wink, 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
bastla
bastla 08.08.2012 um 15:48:51 Uhr
Goto Top
Hallo mybusiness1987!
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
mybusiness1987
mybusiness1987 08.08.2012 um 15:50:55 Uhr
Goto Top
oh ja, entschuldige, daran habe ich garnicht gedacht. teste es gleich mal...
mybusiness1987
mybusiness1987 08.08.2012 um 16:04:58 Uhr
Goto Top
Das vorher war etwas Blödsinn :P

so hat es funktioniert:

for /f "tokens=3*" %%i in (%LASTLW%\ebt\test.log) do if %%i equ 0 echo del "%%j">>ftp.txt  

Trotzdem vielen Dank face-smile

Grüße
Armin
mybusiness1987
mybusiness1987 14.08.2012 aktualisiert um 11:23:26 Uhr
Goto Top
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:

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
bastla
bastla 14.08.2012 um 11:58:25 Uhr
Goto Top
Hallo mybusiness1987!

Du musst ja zuerst die aktuelle Dateigröße ermitteln - daher eher:
for /f "tokens=3*" %%i in (%LASTLW%\ebt\test.log) do for %%a in ("%LASTLW%\ebt\test\%%j") do if %%~za neq %%i echo del "%%j">>ftp.txt
Grüße
bastla
mybusiness1987
mybusiness1987 14.08.2012 um 13:00:03 Uhr
Goto Top
Danke dir vielmals, funktioniert super face-smile

Gruß
Armin