mikrocontroller.net

Forum: PC-Programmierung Automatisch Daten von FTP Server laden


Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leuts


Ich habe ein kleines Problem mit einer Batch Datei

Dieses Script ins nämlich für Folgende Situation gedacht:

Aus einem Webshop werden die gewünschten Bilder für einen Druck im FTP 
Verzeichniss des Webservers gespeichert. Damit der Speicher des Servers 
nicht unter den ganzen Bilder zuneige geht sollen die Bilder vom FTP 
Server geladen und anschließend gelöscht werden. Momentan würde es so 
laufen, dass es alle Bilder runter läd und danach erst die Bilder 
löscht. (Erst Script 1, danach Script 2 starten)Da aber in der Zeit wo 
die Bilder runtergeladen werden schon wieder neuen Bilder eingesendet 
werden, würden die neu eingesendeten Bilder gleich mitgelöscht werden.


Habe bereits was gutes gefunde, was auch fast den Zweck erfüllt:

[quote=Dostips]This batch connects twice to the FTP server. First time 
it retrieves a list of files on the FTP server. This list is being 
trimmed to contain only files that don`t already exist locally. The 
files in the trimmed list are then downloaded during a second 
connection. Note: Since all files are passed into the FTP`s MGET command 
there might be a limit to the number of files that can be processed at 
once.
[/quote]
@Echo Off

REM -- Define File Filter, i.e. files with extension .png
Set FindStrArgs=/E /C:".png"

REM -- Extract Ftp Script to create List of Files
Set "FtpCommand=ls"
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
Rem Notepad "%temp%\%~n0.ftp"

REM -- Execute Ftp Script, collect File Names
Set "FileList="
For /F "Delims=" %%A In ('"Ftp -v -i -s:"%temp%\%~n0.ftp"|Findstr %FindStrArgs%"') Do (
    Call Set "FileList=%%FileList%% "%%A""
)

REM -- Extract Ftp Script to download files that don't exist in local folder
Set "FtpCommand=mget"
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
Rem Notepad "%temp%\%~n0.ftp"

For %%A In (%FtpCommand%) Do Echo.%%A



REM -- Execute Ftp Script, download files
ftp -i -s:"%temp%\%~n0.ftp"
Del "%temp%\%~n0.ftp"
GOTO:EOF




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


[Ftp Script 1]:S
!Title Connecting...
open [Server]
[user]
[password]

!Title Preparing...

lcd c:\test
binary
hash

!Title Processing... %FtpCommand%
%FtpCommand%

!Title Disconnecting...
disconnect
bye




Um die Datein jetzt zu löschen habe ich eine 2. Batch erstellt inder ich 
den Befehl MGET in MDEL umgeschrieben habe.

Gibt es da ne Möglichkeit den MDEL befehl in die 1. Batch mit reinzu 
nehmen, damit alles mit einer Batch erledigt wird ?

mfg

(Code von dostips.com)

Autor: Andreas W. (geier99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo icke,

> Gibt es da ne Möglichkeit den MDEL befehl in die 1. Batch mit reinzu
> nehmen, damit alles mit einer Batch erledigt wird ?

hmm, dunkel kann ich mich an einem "CALL XXX.BAT" erinnern :-)

Bye
Andi

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm soweit schnonmal danke, ist aber noch nicht ganz was ich brauche..

Also es soll so sein, dass es die datei downloaded und anschließend 
gleich löscht.. und dann immer wieder im wechsel bis alle geladen sind.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Del "%temp%\%~n0.ftp"
Statt die Datei zu löschen, schau sie dir doch mal an...
Wenn ich das richtig sehe wird dort die Liste der FTP Befehle die 
ausgeführt werden soll erstellt.

Bei der Erstellung dieser Datei müsstest du nun das Skript so 
modifizieren das es neben dem GET auch gleich ein DEL absetzt.

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, vielleicht eine blöde frage, aber wo finde ich die Datei ?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das "rem" hier wegnehmen dann sollte er dir die in notepad öffnen.
Rem Notepad "%temp%\%~n0.ftp"
Ansosnten im durch die Umgegbungsvariable %temp% bezeichnetem 
Verzeichnis

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es kommt das notepad mit folgendem Inhalt:

!Title Connecting...
open Server
USER
PASSWORD

!Title Preparing...

lcd c:\test
binary
hash

!Title Processing... mget "dsadas (6).txt" "Neues Textdokument.txt" 
"fkdfjkdsfjlsdf (6).txt" "dsadas (4).txt" "Neues Textdokument - Kopie 
(3).txt" "dsadas (2).txt" "Neues Textdokument - Kopie (2).txt" 
"fkdfjkdsfjlsdf (3).txt" "fkdfjkdsfjlsdf (4).txt" "fkdfjkdsfjlsdf 
(5).txt" "fkdfjkdsfjlsdf (1).txt" "Neues Textdokument - Kopie (5).txt" 
"Neues Textdokument - Kopie (4).txt" "dsadas (3).txt" "Neues 
Textdokument - Kopie.txt" "dsadas (1).txt" "dsadas (5).txt" 
"fkdfjkdsfjlsdf (2).txt"
mget "dsadas (6).txt" "Neues Textdokument.txt" "fkdfjkdsfjlsdf (6).txt" 
"dsadas (4).txt" "Neues Textdokument - Kopie (3).txt" "dsadas (2).txt" 
"Neues Textdokument - Kopie (2).txt" "fkdfjkdsfjlsdf (3).txt" 
"fkdfjkdsfjlsdf (4).txt" "fkdfjkdsfjlsdf (5).txt" "fkdfjkdsfjlsdf 
(1).txt" "Neues Textdokument - Kopie (5).txt" "Neues Textdokument - 
Kopie (4).txt" "dsadas (3).txt" "Neues Textdokument - Kopie.txt" "dsadas 
(1).txt" "dsadas (5).txt" "fkdfjkdsfjlsdf (2).txt"

!Title Disconnecting...
disconnect
bye



Dann müsste ja eigentlich dieser Code kopiert werden und dann das mget 
durch mdel ersetzt werden..

Set "FtpCommand=mget"
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set 
"FtpCommand=%%FtpCommand%% "%%~A""
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
REM Notepad "%temp%\%~n0.ftp"

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht leider nicht er führt dann nur MDEL aus..

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach mal im zweiten, kopierten Abschnit aus dem '>' ein '>>'. Sonst 
überschreibst Du den ersten Abschnitt mit dem mget wieder.

Call:extractFileSection "[Ftp Script 1]" "-">>"%temp%\%~n0.ftp"

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht leider nicht.. er löscht die Datein nicht..

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut ich habs.. geht bestimmt auch um einiges einfacher aber es läuft
@Echo Off


REM -- Define File Filter, i.e. files with extension .txt
Set FindStrArgs=/E /C:".txt"

REM -- Extract Ftp Script to create List of Files
Set "FtpCommand=ls"
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
Rem Notepad "%temp%\%~n0.ftp"

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

REM -- Execute Ftp Script, collect File Names
Set "FileList="
For /F "Delims=" %%A In ('"Ftp -v -i -s:"%temp%\%~n0.ftp"|Findstr %FindStrArgs%"') Do (
    Call Set "FileList=%%FileList%% "%%A""
)

REM -- Extract Ftp Script to download files that don't exist in local folder
Set "FtpCommand=mget"
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
REM Notepad "%temp%\%~n0.ftp"





REM -- Extract Ftp Script to download files that don't exist in local folder
Set "FtpCommand=mdel"
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.fftp"
REM Notepad "%temp%\%~n0.fftp"

For %%A In (%FtpCommand%) Do Echo.%%A

REM -- Execute Ftp Script, download files
ftp -i -s:"%temp%\%~n0.ftp"
ftp -i -s:"%temp%\%~n0.fftp
Del "%temp%\%~n0.ftp"
Del "%temp%\%~n0.fftp"
GOTO:EOF



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


[Ftp Script 1]:S
!Title Connecting...
open SERVER
USER
PASSWORD

!Title Preparing...

lcd c:\test
binary
hash

!Title Processing... %FtpCommand%
%FtpCommand%

!Title Disconnecting...
disconnect
bye

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, OK.
Nach den Zeilen mit mget steht ja schon das diconnect im ftp-Script, 
dann kann er die Files natürlich nicht mehr löschen :(

Erzeug am besten zwei Sripts. Also so etwa:
Set "FtpCommand=mget"
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
Rem Notepad "%temp%\%~n0.ftp"

Set "FtpCommand=mdel"
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp1"
Rem Notepad "%temp%\%~n0.ftp1"

Und dann den Abschnitt zum Ausführen auch verdoppeln:
REM -- Execute Ftp Script, download files
ftp -i -s:"%temp%\%~n0.ftp"
Del "%temp%\%~n0.ftp"

REM -- Execute Ftp Script, delete files
ftp -i -s:"%temp%\%~n0.ftp1"
Del "%temp%\%~n0.ftp1"

GOTO:EOF

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huch, da war ich wohl zu langsam. Ist ja genau die selbe Lösung.

Die folgenden Zeilen kannst du aber weglassen:
Set "FtpCommand=ls"
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.fftp"
Rem Notepad "%temp%\%~n0.fftp"

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schonma für die ganzen tipps
Ih habe aber noch eine kleine Sache:

Ist es möglich Dateinamen auszulesen und die dann Anhand des Namens in 
verschiedene Ordner zu kopieren ? Ich denke ich erkläre es am besten mal 
mit einem Bespiel:

Ich habe Datei: xyz_001.txt Die 001 Steht dafür, wie oft die Datei 
gedruckt werden soll. Kann man es so machen, dass er alle Datein die am 
Ende >1 sind in einen andren ordner kopiert mit den namen sonder (bsp) 
und die <1 in einen anderen ordner ?

Am besten wäre noch, das man die Datei so oft kopiert wie es am ende 
steht alo bei xyz_003.txt, die datei ingesamt 3 mal im ordner vohanden 
ist

MFG

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine Idee ?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit DOS-Batch-Mitteln weiß ich nicht, ob es geht.
Mit den Unix-Kommandos geht sowas (mv, sed etc.).
Die gibt es auch für Windows, inkl. bash. Damit geht es dann sicher
deutlich einfacher.
(Daß damit alles bisher Gebaute wahrscheinlich auch gleich einfacher
gewesen wäre, erwähne ich jetzt besser nicht.)

Autor: icke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider kenn ich mich mit Unix kein Stück aus..

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
icke schrieb:
> Leider kenn ich mich mit Unix kein Stück aus..
Leider haben wir keine Zeit/Lust/... für dich die einfachste Lösung zu 
suchen.
Wenn man etwas möchte, dann muß man meistens halt doch etwas selbst 
dafür tun. Und zum Thema batch Verarbeitung gibt es nun auch Millionen 
Websites, wenn du ihrgeneine Programmiersprache kannst könntest du dir 
die Kommandodatei auch nach deinen wünsche zusammenstellen...
Nur immer hier warten, bis man dir die Lösung vorwirft wird dich 
vermutlich auf Dauer nicht ans Ziel bringen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.