FTP不支持目录的下载,不过FTP命令提供了mget命令,允许多文件下载,但每下载一个文件都需要确认,不能自动完成。本文主要介绍使用批处理,结合FTP的相关命令来实现批量文件的下载,以便达到目录下载的目的。
大致想法如下:
ftp-s:filenamehosts>result.txt执行脚本,并将结果定向输出到result.txt
脚本内容,如
cdmydir
ls
bye
可以将mydir命令列出
然后使用批处理分析result.txt
从150OpeningASCIImodedataconnectionforfilelist.的下一行开始算,直到226Transfercomplete都是要下载的内容
然后用批处理加ftp脚本,使用get命令逐个下载
但实际过程中发现,在FTP脚本中使用get有问题,提示参数错误,无法使用。
查看了ftp的帮助ftp -?
G:>ftp-?
TransfersfilestoandfromacomputerrunninganFTPserverservice
(sometimescalledadaemon).Ftpcanbeusedinteractively.
FTP[-v][-d][-i][-n][-g][-s:filename][-a][-w:windowsize][-A][host]
-vSuppressesdisplayofremoteserverresponses.
-nSuppressesauto-loginuponinitialconnection.
-iTurnsoffinteractivepromptingduringmultiplefile
transfers.
-dEnablesdebugging.
-gDisablesfilenameglobbing(seeGLOBcommand).
-s:filenameSpecifiesatextfilecontainingFTPcommands;the
commandswillautomaticallyrunafterFTPstarts.
-aUseanylocalinterfacewhenbindingdataconnection.
-Aloginasanonymous.
-w:buffersizeOverridesthedefaulttransferbuffersizeof4096.
hostSpecifiesthehostnameorIPaddressoftheremote
hosttoconnectto.
Notes:
-mgetandmputcommandstakey/n/qforyes/no/quit.
-UseControl-Ctoabortcommands.
发现 -i 参数可以去除mget的提示,经过测试,实现了如下脚本(使用了匿名登入,如果非匿名,可以修改登入脚本):
echocdautoruns>ftp.txt
echomget*>>ftp.txt
echobye>>ftp.txt
ftp-i-A-s:ftp.txt10.1.103.10
不过,这只是下载了目录中的文件,如果有子目录,那还需要用dir命令输出,并转向输出到文本,用find来提取目录,如:
echocdautoruns>ftp.txt
echodir>>ftp.txt
echobye>>ftp.txt
ftp-A-s:ftp.txt10.1.103.10|find"<DIR>">result.txt
for/f"tokens=2,3*"%%iin(result.txt)doecho%%k
如有子文件夹,那就要深入编写了。
经过编写测试,实现如下脚本,运行环境WINXP SP2,运行通过,未载其它系统上测试过:
1、主要脚本ftpget.bat,更改前4个变量的相关信息,该脚本调用makeTree.bat,请参见2
remFTP服务器地址
sethost=10.1.103.10
remFTP登入名,如果匿名不用改
setuser=anonymous
remFTP登入密码,如果匿名不用改
setpass=123456
rem需要下载的FTP目录,如果下载子目录以分格
setdirname=目录1子目录
sethomedir=%cd%
rem生成FTP目录结构
deltree.txt
start/wcmd/cmakeTree%dirname%0
delresult*.txt
for/f"delims=/"%%iin(tree.txt)do(
rem获取dirname的所有文件
rem=============================
cd%homedir%
md%%i
cd/d%%i
echo%user%>ftp.txt
echo%pass%>>ftp.txt
echocd%%i>>ftp.txt
remmget*.*下载所有文件,但不能下载无扩展名的文件;
rem如果使用mget*可以下载所有文件,但会把子目录的文件也下载过来
echomget*.*>>ftp.txt
echobye>>ftp.txt
ftp-i-A-s:ftp.txt%host%
delftp.txt
rem==============================
)
cd%homedir%
deltree.txt
2、maketree.bat,生成FTP目录树
rem生成FTP目录结构
rem调用方法maketreedir1dir2n(n>=1)
rem%1==dir1dir2
rem%2==n
set/atreetime=%2+1
echo%1>>tree.txt
echo%user%>ftp%treetime%.txt
echo%pass%>>ftp%treetime%.txt
echocd%1>>ftp%treetime%.txt
echodir>>ftp%treetime%.txt
echobye>>ftp%treetime%.txt
ftp-A-s:ftp%treetime%.txt%host%|find"<DIR>">result%treetime%.txt
for/f"tokens=2,3*"%%iin(result%treetime%.txt)do(start/wcmd/cMaketree.bat%1%%k%treetime%)
delresult%treetime%.txt
delftp%treetime%.txt
虽然已经实现,但仍然有小问题,就是mget *.* 不能下载无扩展名的程序;如果使用mget * 可以下载所有文件,但会把子目录的文件也下载过来。get在FTP脚本中出错也不知为何。
相关信息参考:使用FTP 批处理脚本,Ftp 子命令