Wie überprüfe ich das Ergebnis eines FTP-Skripts mit einer BAT-Datei? [geschlossen]

Geschlossen. Diese Frage ist " off-topic. Es akzeptiert derzeit keine Antworten.

Möchten Sie diese Frage verbessern? Aktualisiere die Frage so, dass sie zum Thema für Super User.

Geschlossen Vor 6 Jahren.

Verbessern Sie diese Frage

Ich habe ein .bat-Datei, die ein FTP-Skript ausführt, Dateien vom Server abruft und auf meinen Computer kopiert. Funktioniert gut.

Ich will das jetzt .bat-Datei zu melden, wenn einer dieser Fehler aufgetreten.

Wenn du mich in die richtige Richtung weisen könntest auf die allgemeine Vorstellung, wie das geht, das wäre großartig.

Dank.

Author: Tommy, 2010-01-21

5 answers

Um ehrlich zu sein, hatte ich noch nie großen Erfolg mit festen FTP-Skripten. Selbst wenn Sie mit den Rückgabecodes umgehen, ist es schwer genau zu wissen, was schief gelaufen ist.

Ich würde stattdessen empfehlen, PowerShell oder Python für den Job zu verwenden. Beide haben Zugriff auf einen FTP-Client, der dynamisch gesteuert werden kann. Sie wissen genau, was funktioniert hat oder fehlgeschlagen ist, und können sich dann und dort mit dem Problem befassen.

Einfaches Beispiel in PS

$url = "ftp://ftp.foo.com/bar.txt"
$destination = "c:\foo\bar.txt"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($url, $destination)

Wenn Sie mehr tun müssen, komplizierte Dinge würde ich beginnen Sie mit einem Blick auf http://msdn.microsoft.com/en-us/library/ms229718.aspx Diese Beispiele sind in C#, aber es sollte ziemlich einfach sein, sie in PS zu konvertieren.

Ein Skript, das auf diese Weise erstellt wurde, kann ein Verzeichnis auflisten und die gewünschten Dateien durchlaufen. Wenn es Fehler gibt, können Sie sie auf Dateiebene behandeln, wie Sie möchten.

 4
Author: Cephas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-01-21 22:13:10

Hier ist, wie es in einer BAT-Datei zu tun.

Rufen Sie FTP auf, während Sie die Ausgabe und Fehler in separate Dateien umleiten. Wenn die Fehlerdatei nicht leer ist, liegt ein Problem vor.

Angenommen, Sie haben set genannte Variablen erstellt FTPFILE, OUTPUTFILE und ERRORFILE, dann sollte Folgendes funktionieren:

  1. Rufen Sie FTP auf und erfassen Sie Ausgaben und Fehler in separaten Dateien.

    ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%"
    
  2. Überprüfen Sie, ob der FTP-Aufruf fehlgeschlagen ist

    if  ERRORLEVEL 1 (
        echo Call to ftp returned an error. See file: %OUTPUTFILE%
        exit /b 1
    )
    
  3. Überprüfen Sie, ob die FTP-Sitzung enthalten ist Fehlermeldung. Überprüfen Sie dazu die Größe der Fehlerdatei.

    FOR /F "usebackq" %%A IN ('%ERRORFILE%') DO set ERRORFILESIZE=%%~zA
    if %ERRORFILESIZE% GTR 0 ( 
        echo Error while performing the FTP. See file: %ERRORFILE%
        exit /b 2
    )
    
 2
Author: Shez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-11-09 10:20:59

, Während Shez Beispiel oben ist ein gutes standard-Weg, um capture-Fehler von den meisten dos-basierten Programme, set ERRORLEVEL-und Ausgabe von standard error (2>), ftp.exe out of the box von MS setzt ERRORLEVEL nicht. ERRORLEVEL bleibt Null, unabhängig davon, ob das Skript (-s: parameter) erfolgreich ist oder fehlschlägt. Das Umleiten von Standardfehlern (2>) zu "%ERRORFILE%" funktioniert ebenfalls nicht, da diese Datei immer eine Null-Byte-Datei ist (da ftp.exe gibt immer ERROR_SUCCESS oder 0 zurück) also nur eine leere datei wird erstellt. Also die Befehlszeichenfolge:

ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%"

Wird niemals die erwarteten Ergebnisse liefern. Wenn wir gezwungen sind, den Microsoft FTP-Client zu verwenden, ist es am besten, die %OUTPUTFILE% für bestimmte Textzeichenfolgen zu analysieren, die auf einen Fehler hinweisen, oder einen anderen FTP-Client als den von MS (wie IPSWITCH WS_FTP) zu verwenden, der eine bessere Fehlererkennung ermöglicht. Ich werde Codebeispiele zur Analyse der %OUTPUTFILE% in wenigen Stunden weiterleiten, sobald ich die Brute-Force-Codierung abgeschlossen habe. Danke!

Follow-up

Siehe meinen zweiten Beitrag unten für Beispiel interaktive Microsoft FTP-Sitzung. Parsing Beispiel ist als nächstes...OK, was folgt, ist eine Variation von Martijn S post on stackoverflow.com hier. Meine Lösung verwendet FINDSTR und eine separate Textdatei mit Suchkriterien:

Erstellen Sie eine Textdatei (FTP_ERR_SEARCH_CRITERIA.txt) enthält die folgenden Textzeichenfolgen:

not connected
not found
failed

Rufen Sie die folgende Unterroutine aus Ihrem Batch/Befehl auf file:

::
::=============================================================================
:WIN_FTP_ERROR %1=%_SearchCriteria% %2=%_InputFile%
::=============================================================================
::
    set _SearchCriteria=%1
    set _InputFile=%2
    set _tokens="tokens=*"
    for /F %_tokens% %%G in ('findstr /I /G:%_SearchCriteria% %_InputFile%') do @echo "%%G"
exit /b

Der Aufruf:

call :WIN_FTP_ERROR ".\FTP_ERR_SEARCH_CRITERIA.txt" %OUTPUTFILE%

Beispiel Microsoft FTP-Ausgabe

Weiter, wo ich aufgehört habe... Manchmal ist der beste Weg, um herauszufinden,wie etwas funktioniert, es selbst zu testen, anstatt sich auf die Fülle von Fehlinformationen im Internet gefunden. Also hier geht es. Das folgende Beispiel zeigt zwei verschiedene Dateien: tst.txt und tst.tx (subtiler Unterschied im Namen, aber anders genau gleich). Die tst.txt Datei existiert, während die tst.tx nicht.

Microsoft-FTP-Beispiel (Abstand zur Verdeutlichung Hinzugefügt):

ftp> put tst.txt
200 PORT command successful.
150 Opening ASCII mode data connection for tst.txt.
226 Transfer complete.
ftp: 44 bytes sent in 0.19Seconds 0.24Kbytes/sec.

ftp> put tst.tx
tst.tx: File not found

ftp> get tst.tx
200 PORT command successful.
550 tst.tx: The system cannot find the file specified.

ftp> get tst.txt
200 PORT command successful.
150 Opening ASCII mode data connection for tst.txt(44 bytes).
226 Transfer complete.
ftp: 44 bytes received in 0.00Seconds 44000.00Kbytes/sec.

Beachten Sie, wie das lokale Dateisystem und das entfernte Dateisystem auf die obigen Befehle reagieren:

Für die erste setzen Sie tst.txt Befehl (die Datei ist im lokalen Dateisystem vorhanden) Wir sehen, dass der Remote-Server durch Übertragen der Datei antwortet.

Für die zweite setzen Sie tst.tx Befehl (die Datei tst.tx existiert auf beiden Systemen nicht) wir stellen Sie sicher, dass das lokale Dateisystem mit dem Dateinamen tst antwortet.tx und die Fehlermeldung Datei nicht gefunden

Für die dritte get tst.tx Befehl (wieder die Datei tst.tx existiert nicht) wir sehen, dass das Remote-Dateisystem (eigentlich Remote-FTP-Host) mit dem FTP-Fehlercode antwortet 550, der Dateiname tst.tx und die Fehlermeldung Das System kann die angegebene Datei nicht finden.

Für den vierten und final get tst.txt Befehl (die Datei ist jetzt auf dem Remote-System vorhanden) Wir sehen, dass das Remote-System mit einer erfolgreichen Übertragung antwortet.

Warum all diese Erklärung? Es ist wichtig, wenn wir die Datei im vorherigen Beitrag analysieren, um zu sehen, welche Fehlermeldungen von MS ftp zurückkommen.exe.

 2
Author: Mark Ronollo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-05-23 12:41:44

Es ist üblich, dass Konsolenanwendungen einen Code zurückgeben, der angibt, dass ein Fehler aufgetreten ist, sie werden beschrieben, z. B. hier. Wenn ftp nach einem Fehler beendet wird, gibt es wahrscheinlich einen Code ungleich Null zurück, der einen Fehler anzeigt. IMHO gibt es keine einfache Möglichkeit, die Ausgabe eines Programms in Stapeldateien zu analysieren, aber Sie können errorlevel überprüfen und eine Protokolldatei speichern (mithilfe der Ausgabestromumleitung: command args >log) oder per E-Mail senden.

 1
Author: whitequark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-01-21 19:59:26

Diese Fehlermeldung ist ein FTP-spezifischer Fehler und liegt daran, dass Ihre Firewall standardmäßig deaktiviert wird FTP-verbindungen (das ist eine gute Sache!).

Sie können diese Nachricht ignorieren, da sie Ihren Computer in keiner Weise beeinträchtigt.

 1
Author: Hartmut Jager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-02-03 06:56:40