Dateitypspezifische Backups via FTP per Taskplaner (und ggf. "wput")

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Hallgato.

    Dateitypspezifische Backups via FTP per Taskplaner (und ggf. "wput")

    Hallo zusammen :)

    Ich suche nach einer Möglichkeit, in regelmäßigen Abständen eine Backuproutine
    für meine Verzeichnisse laufen zu lassen. Speziell geht es um .jpgs, die aber noch
    mit einigen anderen Dateien zusammen in ihren Verzeichnissen liegen.

    Ich bin bereits auf "wput" gestoßen - quasi das Gegenüber von "wget" - ein
    Kommandozeilentool zum Hochladen von Dateien via ftp. Geht schön schnell,
    hab ich schon so von Hand getestet.

    Nun birgt das Programm aber ein Problem, welches ich gerne in den Griff kriegen
    würde: Es unterstützt soweit ich das sehe keine wildcards, also ein Screening
    nach *.jpg würde entfallen.

    Ansonsten bietet es aber schon einige ganz nette Einstellungsmöglichkeiten, wie
    Timeouthandling, Überschreiben ja/nein etc.

    Die allgemeine Syntax lautet:
    wput "C:\Quellverzeichnis" username:passwort@192.168.0.1/Zielverzeichnis/"

    Ließe sich nicht mithilfe von VB eine FOR Schleife einbauen? Sodass zunächst
    geschaut wird, ob eine Datei in einem Verzeichnis eine .jpg ist und wenn ja, ihr
    Dateiname in FILENAME geschrieben wird und die Syntax von wput wiederum
    angepasst wird?

    Ist es einfacher, das gleich kompletto mit Vb zu lösen?

    Dann wäre da noch die Sache mit dem Timing.. ich habe gelesen, dass sich
    solche fertigen ausführbaren Dateien im Taskplaner "ablegen" lassen und
    der führt diese dann in konfigurierbaren Abständen (im Hintergrund) aus?

    Vielen lieben Dank fürs Lesen und jeden Ratschlag :)
    Da das .NET Framework über FTP-Klassen verfügt, würde ich es über VB lösen, da haste auch noch mehr Möglichkeiten.

    Ansonsten würde ich das mit der Schleife durch die Dateien eher mit einem Batch Script lösen, VB wäre dafür dann oversized.
    Guten Tag, sorry, dass ich es nach Wochen noch ausgrabe. Aber ich denke besser so, als einen reduntanten Thread
    zu öffnen. Hatte bis vor kurzem Unistress und jetzt Zeit mich da wieder reinzudenken.

    Ich habe mir das Beispiel von dostips.com mal angeschaut und leider recht wenig verstanden, da es doch schon für
    Fortgeschrittene erklärt ist. Wenn es recht ist, kopiere ich den Code mal hier rein und stelle zu den Abschnitten ein
    paar Fragen, um mir den Ablauf zu vergegenwärtigen.

    edit: habe mich heute nochmal reingefuchst und einiges mehr verstanden. Stimmen meine Kommentare zum Code soweit?

    Quellcode

    1. Set FindStrArgs=/E /C:".txt"

    • ist FindStrArgs ein regulärer Ausdruck oder eine von uns festgelegte Variable?
    • wofür steht /E ? Etwa dafür, dass alle Fileextensions in C: nach ".txt" durchsucht werden sollen?

    Quellcode

    1. Set "FtpCommand=ls"
    2. Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
    3. Rem Notepad "%temp%\%~n0.ftp"

    • Set definiert die Variable FtpCommand mit dem Wert "ls", welcher den FTP-Befehl zum Auflisten des Verzeichnisinhaltes beinhaltet. Warum schreiben wir hier alles in Anführungszeichen, FindStrArgs aber nicht?
    • Die Zeile danach sagt mir gar nichts, aber ich vermute, eine Liste wird in eine temporäre Datei geschrieben.

    Quellcode

    1. Set "FileList="
    2. For /F "Delims=" %%A In ('"Ftp -v -i -s:"%temp%\%~n0.ftp"|Findstr %FindStrArgs%"') Do (
    3. Call Set "FileList=%%FileList%% "%%A""
    4. )

    • Set "FileList=" führt eine Variable ein?
    • For leitet eine Schleife ein. Diese benutzt eine weitere Variable "Delims=" mit dem Parameter /F (=?) und stellt über Ftp ... -s:*.ftp eine Verbindung zum Server her, um eine serverseitige Dateiliste zu erstellen? Auch hier wird nach dem in %FindStrArgs% festgelegten Wert gesucht. Das Ergebnis wird in %%FileList%% gespeichert?

    Quellcode

    1. Set "FtpCommand=mput"
    2. For %%A In (%FileList%) Do set "Exist["%%~A"]=Y"
    3. For /F "Delims=" %%A In ('"dir /b "%localdir%"|Findstr %FindStrArgs%"') Do (
    4. If Not defined Exist["%%~A"] Call Set "FtpCommand=%%FtpCommand%% "%%~A""
    5. )
    6. Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
    7. rem Notepad "%temp%\%~n0.ftp"
    8. For %%A In (%FtpCommand%) Do Echo.%%A

    • Set "FtpCommand=mput" fügt den Ftp-Befehl mput in die FtpCommand-Variable ein.
    • Die zweite Zeile gleicht beide Listen ab und schaut, ob die lokale Datei auch schon remote vorhanden ist, wenn ja, dann Y. Den Rest verteh ich nicht.
    • Wird hier nur eine weitere Liste erstellt, mit allen Dateien, die nicht vorhanden sind?

    Quellcode

    1. ftp -i -s:"%temp%\%~n0.ftp"
    2. Del "%temp%\%~n0.ftp"
    3. GOTO:EOF

    • Hier wird mit ftp -i -s:*.ftp eine Verbindung hergestellt, mithilfe von Daten in der n0.ftp. Der Parameter -i soll eigentlich den Passive-Mode aktivieren, jedoch ist dies mit der Windows-ftp.exe nicht möglich, ist das korrekt? Gibt es ein Workaround?
    • Die n0.ftp wird gelöscht, weil dort eine nach Ausführung der Befehle veraltete Liste von zu übertragenden Dateien enthalten ist?

    Quellcode

    1. :extractFileSection StartMark EndMark FileName -- extract a section of file that is defined by a start and end mark
    2. :: -- [IN] StartMark - start mark, use '...:S' mark to allow variable substitution
    3. :: -- [IN,OPT] EndMark - optional end mark, default is first empty line
    4. :: -- [IN,OPT] FileName - optional source file, default is THIS file
    5. :$created 20080219 :$changed 20100205 :$categories ReadFile
    6. :$source http://www.dostips.com
    7. SETLOCAL Disabledelayedexpansion
    8. set "bmk=%~1"
    9. set "emk=%~2"
    10. set "src=%~3"
    11. set "bExtr="
    12. set "bSubs="
    13. if "%src%"=="" set src=%~f0& rem if no source file then assume THIS file
    14. for /f "tokens=1,* delims=]" %%A in ('find /n /v "" "%src%"') do (
    15. if /i "%%B"=="%emk%" set "bExtr="&set "bSubs="
    16. if defined bExtr if defined bSubs (call echo.%%B) ELSE (echo.%%B)
    17. if /i "%%B"=="%bmk%" set "bExtr=Y"
    18. if /i "%%B"=="%bmk%:S" set "bExtr=Y"&set "bSubs=Y"
    19. )
    20. EXIT /b

    • Hier versteh ich nur noch Bahnhof. Dateidatum, Start- und Endmarkierungen??

    Quellcode

    1. [Ftp Script 1]:S
    2. !Title Connecting...
    3. open example.com
    4. username
    5. password
    6. !Title Preparing...
    7. cd public_html/MyRemoteDirectory
    8. lcd c:\MyLocalDirectory
    9. binary
    10. hash
    11. !Title Processing... %FtpCommand%
    12. %FtpCommand%
    13. !Title Disconnecting...
    14. disconnect
    15. bye

    • Hier wird die Verbindung zur eigentlichen Dateiübertragung aufgebaut, nicht?
    • Wozu dient [Ftp Script 1]:S ?
    • Vorher werden die Arbeitsabläufe definiert, die dann in %FtpCommand% gespeichert werden. Die Variable erhält also einmal den Befehl "ls" und einmal "mput", welche nacheinander abgearbeitet werden.
    Desweiteren finde ich nirgends Hinweise darauf, ob dieses Script auch auf Unterverzeichnisse Rücksicht nimmt
    und diese auf dem Zielsystem erstellt?

    Kann ich mit diesem Script nur das Verzeichnis, in dem die Batchdatei abgelegt ist, bearbeiten oder kann ich
    einen beliebigen Pfad angeben, dessen Umgebung abgearbeitet werden soll?
    Sorry für die ganzen Dullyfragen, aber ich bin neu auf dem ganzen Feld und mein Englisch kommt bei den
    erläuternden Webseiten oft schnell an seine Grenzen..
    Herzlichen Dank!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Hallgato“ ()