Toon posts:

[2000] DOS batch nieuwste file van ftp dir downloaden

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik draai een webshop op een webserver (remote), hier maak ik regelmatig SQL backups van. Die backups worden in een directory op de FTP opgeslagen.
Ik werd een beetje ziek van het handmatige gedoe -> Nieuwste .sql bestand downloaden, phpMyAdmin browsen, database selecteren en via phpMyAdmin het .sql bestand importeren.

Na eens geprobeerd te hebben het .sql bestand te importeren met de mysql daemon merkte ik dat dit minstens 10x zo snel ging.
Met die conclusie heb ik een beetje uitgezocht hoe ik een batch bestandje schrijf.

De situatie is als volgt; ik heb op die remote ftp de .sql dumps staan, genaamd als (bijv.) db_webshop-20040826093905.sql. (dus db_webshop-$jaar$maand$dag$uur$minuten$seconden.sql)
Dus de volgende globale stappen:
  • Verbind met FTP
  • Haal het nieuwste bestand uit de SQL dumps map op
  • Download dit bestand
Ik wil het batch bestand de volgende stappen laten ondernemen:
  • Verbind met FTP, browse naar directory met SQL dumps
  • Haal lijst van bestanden op
  • Zoek het nieuwste bestand uit de lijst
  • Download dat bestand met het GET commando
  • Verbreek FTP verbinding
Ik loop dus vast bij het zoeken naar het nieuwste bestand. Omdat de bestanden naar hun datum genoemd zijn hoef ik niet eens de datum eigenschappen per files op te halen, maar ik weet niet waarnaar ik moet zoeken.

Ik heb het volgende geprobeerd (oude code is uitgecommentaard):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
@echo off
::
:: Get newest file from given FTP directory
:: 
set ftp_host=ftp.host
set ftp_user=username
set ftp_passw=password
set ftp_dir=/dir/to/webshop/admin/backups/
set default_dir=D:\webshop\admin\backups\

echo.
echo.
echo *** This script downloads the newest file from the configured FTP 
echo     to the directory set by the user.
echo.
set /p user_dir=Directory to download file to: 

if "%user_dir%"=="" set user_dir=%default_dir%

echo.
echo *** Download directory set to '%user_dir%'
echo.
echo.

:: Create the temporary FTP script file
(
  echo %ftp_user%
  echo %ftp_passw%
  echo cd %ftp_dir%
  echo ascii
  echo ls
  echo quit
) > script.ftp

:: Open FTP connection and get newest file from remote directory
ftp -s:script.ftp %ftp_host% > output.ftp

:: Get latest ftp file
for /f "tokens=1* delims=" %%A IN ('type output.ftp') DO IF "%%A"=="^.sql" set newest_file=%%A

echo.
echo Newest filename = %newest_file%
goto finish


:finish
:: For the paranoid: overwrite the temporary file before deleting it
TYPE NUL >script.ftp
DEL script.ftp
::TYPE NUL >output.ftp
::DEL output.ftp


::FOR /F "tokens=*" %%A IN ('dir %user_dir% /b /o:d') do set lastfile=%%~fA
::POPD
::echo Newest file: %lastfile%

echo.
echo.
echo *** Reading directory finished.
echo.
goto end

:error
echo.
echo An unknown error occured. Isn't it nice and spooky to discover an unknown error?
echo.
goto end

:end
set default_dir=
set user_dir=


Ik hoop dat iemand me kan helpen met die FOR-statement, alvast bedankt!

Verwijderd

kan je ff een voorbeeld van je output.ftp file posten... anders kunnen we nauwelijks helpen dan verwijzen naar for /?

IF "%%A"=="^.sql" werkt waarschijnlijk niet tenzij je een .sql file hebt (dus niet *.sql)

[ Voor 31% gewijzigd door Verwijderd op 26-08-2004 17:26 ]


Verwijderd

for /f "tokens=1 delims=" %%A IN ('type output.ftp^|find /i ".sql"') DO set newest_file=%%A

probeer dit ff. dit betekent wel dat alleen het laatste .sql bestand eruit gefilterd wordt, maar dat is geloof ik de bedoeling.

Verwijderd

Topicstarter
Voorbeeld van output.ftp (FTP gegevens even veranderd vanwege privacy):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Verbonden met ftp.host.
220 host FTP server (Version wu-2.6.2-12) ready.
Gebruiker (ftp.host:(none)): 
331 Password required for username.

230 User username logged in.  Access restrictions apply.
ftp> ftp> 
cd /dir/to/webshop/admin/backups/
250 CWD command successful.
ftp> ascii
200 Type set to A.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for file list.
db_webshop-20040720135056.sql

db_webshop-20040730100359.sql

db_webshop-20040804104236.sql

db_webshop-20040806152304.sql

db_webshop-20040809092603.sql

db_webshop-20040812115427.sql

db_webshop-20040812133856.sql

db_webshop-20040813121349.sql

db_webshop-20040817004615.sql

db_webshop-20040817010008.sql

db_webshop-20040818140701.sql

db_webshop-20040819152238.sql

db_webshop-20040821145714.sql

db_webshop-20040826004747.sql

db_webshop-20040826093905.sql

226 Transfer complete.
ftp: 465 byte ontvangen in 0,00seconden 465000,00kB/s.

ftp> quit
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 954 bytes in 1 transfers.
221-Thank you for using the FTP service on ftp.host.
221 Goodbye.


Ik ga die for loop van je even proberen, alvast bedankt!

[edit] Die FOR loop werkt! Vet! Bedankt! Nou vraag ik me het volgende af:
Ik moet nu 1x verbinden met de FTP voor de dirlist, en daarna nog een keer om het nieuwste bestand op te halen... Kan dit misschien in 1x? Is het mogelijk om de FTP verbinding nog te laten lopen in de achtergrond en daarna nog 2 losse commando's te geven (GET filename.sql & QUIT)?

[ Voor 15% gewijzigd door Verwijderd op 27-08-2004 10:42 ]


  • ReLight
  • Registratie: Augustus 2001
  • Laatst online: 18-04 11:15

ReLight

echo("What Now ? !")

Waarom de sql files bewaren op de ftp server? Schedule een job om elke 24 h de backup files op te halen, en na een succesvolle retrieve de backup op de ftp weghalen.

Een andere manier is de backup online te maken dmv aanroep van een script (mysql dump) en de output naar een bestand te bewaren met datum tijd (gebruik Wget hiervoor).
Direct bruikbaar, en geen overhead op je server qua opslag.

Mijn zoon & dochter zijn de toekomst, de rest is tijdsvermaak. Home assistant & & Nibe S2125-12/SMO-S40, RMU-s40 & Tado - Volvo C40 ER, SE


Verwijderd

Topicstarter
ReLight schreef op 27 augustus 2004 @ 10:23:
Waarom de sql files bewaren op de ftp server? Schedule een job om elke 24 h de backup files op te halen, en na een succesvolle retrieve de backup op de ftp weghalen.

Een andere manier is de backup online te maken dmv aanroep van een script (mysql dump) en de output naar een bestand te bewaren met datum tijd (gebruik Wget hiervoor).
Direct bruikbaar, en geen overhead op je server qua opslag.
Omdat de backups door gebruikers van de osCommerce installatie op de server handmatig backups maken die opgeslagen worden op een map op de server.

Ik vind het eigenlijk wel handig dat die SQL dumps ook online staan aangezien ik ze dan ook thuis kan downloaden.

Verwijderd

Is het mogelijk om de FTP verbinding nog te laten lopen in de achtergrond en daarna nog 2 losse commando's te geven (GET filename.sql & QUIT)?
volgens mij niet. 2 files echo-en en 2 connects/disconnects is volgens mij de enige oplossing.

Verwijderd

Topicstarter
Okee dan, bedankt voor de hulp! Hij werkt goed, dus het maakt eigenlijk niet zo veel uit ook dat ie 2x verbindt.
Pagina: 1