FTP batch script maken

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

  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
Ik ben bezig met een batch script die een aantal bestanden zou moeten uploaden en downloaden.

tot nu toe heb ik het volgende:

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
@echo off

set ftpuser=[knip]

REM Wachtwoord FTP (let op! Dit wordt niet versleuteld opgeslagen!)
set ftppass=[knip]
REM ALTERNATIEF:
REM set /p ftppass="Wat is het FTP-wachtwoord? >->>"

set tempfolder1=upload
set tf1filemask=*.*

set tempfolder2=download
set tf2filemask=*.*

REM Stap 1. inloggen ftp server
> #.ftp echo %ftpuser%
>> #.ftp echo %ftppass%
>> #.ftp echo trace
>> #.ftp echo hash

REM Stap 2. uploaden bestanden naar tijdelijke directory op ftp server
>> #.ftp echo lcd %tempfolder1%
>> #.ftp echo cd ftptempdir
>> #.ftp echo mput %tf1filemask%
>> #.ftp echo !del /q %tf1filemask%

REM Stap 3. de zojuist geuploade bestanden verplaatsen naar een andere directory op de ftp server
>> #.ftp echo ren *.* 
>> #.ftp echo dir\*.*

REM Stap 4. downloaden andere bestanden van server.
REM Na het downloaden worden de originelen verwijderd.
>> #.ftp echo lcd %tempfolder2%
>> #.ftp echo mget %tf2filemask%
>> #.ftp echo mdel %tf2filemask%
:execute
REM Pas bij deze regel worden bovenstaande opdrachten uitgevoerd.
ftp -i -s:#.ftp %ftpserver%

:exit
REM Afsluitprocedure.

REM opgeslagen variabelen worden leeggemaakt zodat inloggegevens en dergelijke niet meer in het geheugen staan.
set ftpserver=
set ftpuser=
set ftppass=
set tempfolder1=
set tf1filemask=
set tempfolder2=
set tf2filemask=

del #.ftp


Ik wil dus een onbekend aantal bestanden uploaden naar een tijdelijke directory. Als dit voltooid is moeten deze bestanden dmv een Rename opdracht verplaatst worden naar een andere map. (reden hiervoor is dat deze bestanden door een ander programma gefetched worden en de upload dus al voltooid moet zijn als de bestanden in die map komen.)

Deze rename gaat fout, volgens mij kan ik niet met wildcards werken? kan iemand dat wellicht bevestigen. Via google heb ik hier geen uitsluitsel over gekregen. renamen van een enkel bestand gaat wel goed.

Als ik alle bestanden stuk voor stuk moet renamen moet ik dus een lijst van de bestanden opvragen. Ik weet immers niet hoeveel bestanden het zijn, en ook niet hoe ze heten.
Ik zou een lijstje kunnen maken:

code:
1
>> #.ftp echo !dir /b %tempfolder1% > lijst.txt


maar dan zou ik daarna dit bestand per regel moeten uitlezen en die regel dan mbv SET in een variable moeten stoppen. Ik heb het geprobeerd met verschillende commando's maar ik krijg het niet voor elkaar om 1 regel van een bestand zonder additionele opmaak/karakters uit te lezen.

Ander probleem is is dat ik dan waarschijnlijk een for loopje moet maken ofzo zodat ik elke regel uitlees en in een variabele zet. ik weet immers het aantal bestanden niet.

Dimidium facti qui bene coepit habet: sapere aude.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • jecowo
  • Registratie: September 2002
  • Laatst online: 31-01 09:53
Hallo,

Misschien heb je iets aan dit kleine voorbeeld:
## tel alle bestanden in directory
dir /b "F:\directory" |find /c /v "" >count.txt

IF EXIST count.txt. (
FOR /F "eol=;" %%I in (count.txt) do call ftp_bestanden %%I
) else (
echo "Geen bestanden gevonden" >>Logging.txt
)

Apart bestand: ftp_bestanden
## parameter uit bovenstaand voorbeeld
SET AANTAL=%1

Voor de rest een eigen batch maken.

Misschien is dit het wel een voorbeeld waar je wat mee kunt proberen.
Probeer het ook eens met google -> batch files SET
Groeten,

Jeffrey

Incredible


  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
@-NMe-: dit valt inderdaad niet onder programmeren, bedankt voor het verplaatsen.

@jecowo: thanks, ik heb je voorbeeld ietsje aangepast:
code:
1
2
3
4
5
6
7
8
dir /b "C:\" |find /c /v "" >count.txt

IF EXIST count.txt. (
FOR /F "eol=;" %%I in (count.txt) do set aantal=%%I
) else (
echo "Geen bestanden gevonden"
)
echo %aantal%

Dit heb ik getest, en dit stukje werkt en zou ik dus in mijn script kunnen verwerken. Hierna zou ik door een tweede FOR IN DO loop het renamen %n keer uit kunnen voeren.
Ik moet dus nog een %lastfile% variabele aangeven, zodat ik iets zou kunnen doen met de skip optie van FOR:

[code] skip=n - bepaalt het aantal regels dat wordt overgeslagen
aan het begin van het bestand.[/code]

dus het zou dan iets moeten worden met FOR /L "skip=%lastfile%" %%y IN (%currentfile%,1,%currentfile%) DO echo %%y


ik heb de skip niet nodig, als ik (%currentfile%,1,%currentfile%) doe. Hij begint immers pas bij %currentfile%.

maar hoe wijs ik dan mijn bestandslijst aan? (start,step,end) lijkt in plaats van de bestandsnaam te gaan? zou je wellicht nog even kunnen helpen met de syntax hiervan?

Dimidium facti qui bene coepit habet: sapere aude.


  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

Je zou ook als alternatief voor de "gewone" ftp client ncftpclient kunnen proberen.

Dat is van oorsprong een *nix commandline ftp client, maar dan met een veel prettiger commandline opties.
Renamen van files en dergelijke gaat daar wat minder ingewikkeld in :)

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
dat kan ook wel, maar ik wil het script bij een klant gebruiken. Ik gebruik dus liever geen applicaties van derde partijen.

Dimidium facti qui bene coepit habet: sapere aude.


  • alt-92
  • Registratie: Maart 2000
  • Niet online

alt-92

ye olde farte

Mja :)
Het is een free (GPL) commandline tool, wellicht dat dat enige bezorgdheid over licenties en dergelijke weg kan nemen? :)

Zit er een pattern in de filenames? Zeg maar een vaste extensie of eerste/laatste characters in de filename?

ik heb een 864 GB floppydrive! - certified prutser - the social skills of a thermonuclear device


  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
Ja, de eerste twee letters zijn altijd hetzelfde, hierna volgt een aantal cijfers, en vervolgens de extensie.
ik heb van het weekend niet zoveel tijd hiervoor gehad, maar ik ga hier vandaag weer mee verder.

Dimidium facti qui bene coepit habet: sapere aude.


  • jecowo
  • Registratie: September 2002
  • Laatst online: 31-01 09:53
Ik wil nog wel even meegeven dat ik ongeveer hetzelfde heb gemaakt, maar die windows FTP client werkt dus niet altijd even prima.. Ik gebruik nu FlashFXP. Die kun je ook via een dos commandline tool aanroepen. Enig nadeel dat deze op de remote site geen bestanden kan verwijderen..

Met Linux werkt dit toch allemaal een stuk prettiger..

Incredible


  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
ja, klopt. de Windows FTP client is zeker niet ideaal, maar wel altijd aanwezig.
En de enige beperking waar ik nu tegenaan blijf lopen is de onmogelijkheid om meerdere remote files te renamen.

Ik moet dit dus stuk voor stuk doen, wat zowieso beter is ivm foutopsporing en dergelijke. Hiervoor moet ik dus een FOR-loop definieren die de %n-ste regel van een textfile in een variabele zet. deze variabele kan ik dan in een rename opdracht plakken.

Als ik dat stukje getackeld heb, ben ik volgens mij klaar.

Dimidium facti qui bene coepit habet: sapere aude.


  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
Ik heb nu de volgende stukjes code:

1.
code:
1
dir /b "C:\" |find /c /v "" >count.txt


2.
code:
1
dir /b "C:\" >files.txt


3.
code:
1
2
3
4
5
6
7
8
9
@echo off
setlocal
set /A lines=%line% - 1
if %lines% LEQ 0 set lines=0
if %lines% EQU 0 set skiplines=
if %lines% NEQ 0 set skiplines=skip=%lines%
for /F "%skiplines% tokens=* " %%i in (%file%) do @echo %%i&goto end
:end
endlocal


Nu weet ik dus 1. hoeveel bestanden ik heb, 2. hoe deze heten. en met 3. kan ik deze bestanden stuk voor stuk uitlezen. Hiermee zou ik dus voldoende info moeten hebben om een FOR loopje te maken die de uitvoer van 3. in een variabele zet (%currentfile%). Hierna kan ik dan met behulp van deze variabele een rename uitvoeren om vervolgens de volgende bestandsnaam in te lezen. Dit moet dan in totaal zo veel herhaald worden zoals gespecificeerd in 1.

Dit stukje krijg ik echter niet lopend.

Dimidium facti qui bene coepit habet: sapere aude.


Verwijderd

ik stel voor dat je je script probeert te maken in vbscript/jscript. Daarin zou je dat probleemloos klaargespeeld moeten krijgen.

  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
maar daar ben ik nog slechter mee dan met dos commando's! :D

volgens mij moet het trouwens kunnen door een CALL opdracht te plaatsen aan het eind van de FOR LOOP, direct na DO

Dimidium facti qui bene coepit habet: sapere aude.


  • _Apache_
  • Registratie: Juni 2007
  • Laatst online: 22:07

_Apache_

For life.

Hoe lukt het met het script?

Ben benieuwd hoe het zich gaat gedragen, wil namelijk een variant hierop maken waarbij winrar ook meehelpt om het e.e.a. over een netwerk heen en weer te sturen..

Zero SR/S 17.3kWh / 2.7 kWP PV / Xtend WP 5kW + HRSolar zonneboiler


  • n1els
  • Registratie: Februari 2004
  • Laatst online: 11-06-2025
nou, ik probeer het tussen mij andere werkzaamheden door te doen en dat gaat niet echt. Ik heb wel de toezegging gekregen dat ik mij hier morgen wat meer fulltime op kan richten, dus wellicht dat ik het dan wel werkend kan krijgen.

voor mijn gevoel zit ik er dicht bij.

met dit stukje:
code:
1
2
3
4
5
6
7
8
9
@echo off
setlocal
set /A lines=%line% - 1
if %lines% LEQ 0 set lines=0
if %lines% EQU 0 set skiplines=
if %lines% NEQ 0 set skiplines=skip=%lines%
for /F "%skiplines% tokens=* " %%i in (%file%) do @echo %%i&goto end
:end
endlocal


kan ik al een bestand uit een lijst lezen. nu staat daar nog do @echo %%i, maar daar zou ik dan do set %currentfile% ofzo van kunnen maken zodat ik het huidige bestand ook op andere plaatsen in het script kan gebruiken.
Verder staat dit in een apart .bat bestandje, en dit moet dan nog in het andere bestand erbij gebreid worden.

Dimidium facti qui bene coepit habet: sapere aude.

Pagina: 1