Forum: PC-Programmierung Automatisch Daten von FTP Server laden


von icke (Gast)


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]
1
@Echo Off
2
3
REM -- Define File Filter, i.e. files with extension .png
4
Set FindStrArgs=/E /C:".png"
5
6
REM -- Extract Ftp Script to create List of Files
7
Set "FtpCommand=ls"
8
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
9
Rem Notepad "%temp%\%~n0.ftp"
10
11
REM -- Execute Ftp Script, collect File Names
12
Set "FileList="
13
For /F "Delims=" %%A In ('"Ftp -v -i -s:"%temp%\%~n0.ftp"|Findstr %FindStrArgs%"') Do (
14
    Call Set "FileList=%%FileList%% "%%A""
15
)
16
17
REM -- Extract Ftp Script to download files that don't exist in local folder
18
Set "FtpCommand=mget"
19
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
20
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
21
Rem Notepad "%temp%\%~n0.ftp"
22
23
For %%A In (%FtpCommand%) Do Echo.%%A
24
25
26
27
REM -- Execute Ftp Script, download files
28
ftp -i -s:"%temp%\%~n0.ftp"
29
Del "%temp%\%~n0.ftp"
30
GOTO:EOF
31
32
33
34
35
:extractFileSection StartMark EndMark FileName -- extract a section of file that is defined by a start and end mark
36
::                  -- [IN]     StartMark - start mark, use '...:S' mark to allow variable substitution
37
::                  -- [IN,OPT] EndMark   - optional end mark, default is first empty line
38
::                  -- [IN,OPT] FileName  - optional source file, default is THIS file
39
:$created 20080219 :$changed 20100205 :$categories ReadFile
40
:$source dostips.com
41
SETLOCAL Disabledelayedexpansion
42
set "bmk=%~1"
43
set "emk=%~2"
44
set "src=%~3"
45
set "bExtr="
46
set "bSubs="
47
if "%src%"=="" set src=%~f0&        rem if no source file then assume THIS file
48
for /f "tokens=1,* delims=]" %%A in ('find /n /v "" "%src%"') do (
49
    if /i "%%B"=="%emk%" set "bExtr="&set "bSubs="
50
    if defined bExtr if defined bSubs (call echo.%%B) ELSE (echo.%%B)
51
    if /i "%%B"=="%bmk%"   set "bExtr=Y"
52
    if /i "%%B"=="%bmk%:S" set "bExtr=Y"&set "bSubs=Y"
53
)
54
EXIT /b
55
56
57
[Ftp Script 1]:S
58
!Title Connecting...
59
open [Server]
60
[user]
61
[password]
62
63
!Title Preparing...
64
65
lcd c:\test
66
binary
67
hash
68
69
!Title Processing... %FtpCommand%
70
%FtpCommand%
71
72
!Title Disconnecting...
73
disconnect
74
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)

von Andreas W. (geier99)


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

von icke (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

1
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.

von icke (Gast)


Lesenswert?

hm, vielleicht eine blöde frage, aber wo finde ich die Datei ?

von Läubi .. (laeubi) Benutzerseite


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

von icke (Gast)


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"

von icke (Gast)


Lesenswert?

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

von ... (Gast)


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"

von icke (Gast)


Lesenswert?

geht leider nicht.. er löscht die Datein nicht..

von icke (Gast)


Lesenswert?

Gut ich habs.. geht bestimmt auch um einiges einfacher aber es läuft
1
@Echo Off
2
3
4
REM -- Define File Filter, i.e. files with extension .txt
5
Set FindStrArgs=/E /C:".txt"
6
7
REM -- Extract Ftp Script to create List of Files
8
Set "FtpCommand=ls"
9
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
10
Rem Notepad "%temp%\%~n0.ftp"
11
12
Set "FtpCommand=ls"
13
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.fftp"
14
Rem Notepad "%temp%\%~n0.fftp"
15
16
REM -- Execute Ftp Script, collect File Names
17
Set "FileList="
18
For /F "Delims=" %%A In ('"Ftp -v -i -s:"%temp%\%~n0.ftp"|Findstr %FindStrArgs%"') Do (
19
    Call Set "FileList=%%FileList%% "%%A""
20
)
21
22
REM -- Extract Ftp Script to download files that don't exist in local folder
23
Set "FtpCommand=mget"
24
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
25
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
26
REM Notepad "%temp%\%~n0.ftp"
27
28
29
30
31
32
REM -- Extract Ftp Script to download files that don't exist in local folder
33
Set "FtpCommand=mdel"
34
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
35
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.fftp"
36
REM Notepad "%temp%\%~n0.fftp"
37
38
For %%A In (%FtpCommand%) Do Echo.%%A
39
40
REM -- Execute Ftp Script, download files
41
ftp -i -s:"%temp%\%~n0.ftp"
42
ftp -i -s:"%temp%\%~n0.fftp
43
Del "%temp%\%~n0.ftp"
44
Del "%temp%\%~n0.fftp"
45
GOTO:EOF
46
47
48
49
:extractFileSection StartMark EndMark FileName -- extract a section of file that is defined by a start and end mark
50
::                  -- [IN]     StartMark - start mark, use '...:S' mark to allow variable substitution
51
::                  -- [IN,OPT] EndMark   - optional end mark, default is first empty line
52
::                  -- [IN,OPT] FileName  - optional source file, default is THIS file
53
:$created 20080219 :$changed 20100205 :$categories ReadFile
54
:$source 
55
SETLOCAL Disabledelayedexpansion
56
set "bmk=%~1"
57
set "emk=%~2"
58
set "src=%~3"
59
set "bExtr="
60
set "bSubs="
61
if "%src%"=="" set src=%~f0&        rem if no source file then assume THIS file
62
for /f "tokens=1,* delims=]" %%A in ('find /n /v "" "%src%"') do (
63
    if /i "%%B"=="%emk%" set "bExtr="&set "bSubs="
64
    if defined bExtr if defined bSubs (call echo.%%B) ELSE (echo.%%B)
65
    if /i "%%B"=="%bmk%"   set "bExtr=Y"
66
    if /i "%%B"=="%bmk%:S" set "bExtr=Y"&set "bSubs=Y"
67
)
68
EXIT /b
69
70
71
[Ftp Script 1]:S
72
!Title Connecting...
73
open SERVER
74
USER
75
PASSWORD
76
77
!Title Preparing...
78
79
lcd c:\test
80
binary
81
hash
82
83
!Title Processing... %FtpCommand%
84
%FtpCommand%
85
86
!Title Disconnecting...
87
disconnect
88
bye

von ... (Gast)


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:
1
Set "FtpCommand=mget"
2
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
3
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp"
4
Rem Notepad "%temp%\%~n0.ftp"
5
6
Set "FtpCommand=mdel"
7
For %%A In (%FileList%) Do If Not Exist "%%~A" Call Set "FtpCommand=%%FtpCommand%% "%%~A""
8
Call:extractFileSection "[Ftp Script 1]" "-">"%temp%\%~n0.ftp1"
9
Rem Notepad "%temp%\%~n0.ftp1"

Und dann den Abschnitt zum Ausführen auch verdoppeln:
1
REM -- Execute Ftp Script, download files
2
ftp -i -s:"%temp%\%~n0.ftp"
3
Del "%temp%\%~n0.ftp"
4
5
REM -- Execute Ftp Script, delete files
6
ftp -i -s:"%temp%\%~n0.ftp1"
7
Del "%temp%\%~n0.ftp1"
8
9
GOTO:EOF

von ... (Gast)


Lesenswert?

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

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

von icke (Gast)


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

von icke (Gast)


Lesenswert?

keiner eine Idee ?

von Klaus W. (mfgkw)


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.)

von icke (Gast)


Lesenswert?

Leider kenn ich mich mit Unix kein Stück aus..

von Läubi .. (laeubi) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.