使用FTP下载目录,即FTP命令批量自动下载

  FTP不支持目录的下载,不过FTP命令提供了mget命令,允许多文件下载,但每下载一个文件都需要确认,不能自动完成。本文主要介绍使用批处理,结合FTP的相关命令来实现批量文件的下载,以便达到目录下载的目的。

  大致想法如下:

ftp -s :filename  hosts  > result . txt 执行脚本 , 并将结果定向输出到result . txt
脚本内容,如
cd  mydir
ls
bye
可以将mydir命令列出
然后使用批处理分析result
. txt
从150 Opening ASCII 
mode  data connection  for  file list . 的下一行开始算,直到226 Transfer complete都是要下载的内容
然后用批处理加ftp脚本,使用get命令逐个下载

  但实际过程中发现,在FTP脚本中使用get有问题,提示参数错误,无法使用。

  查看了ftp的帮助ftp -?

G: > ftp -?

Transfers 
files  to and from a computer running an FTP server service
( sometimes called a daemon ).  Ftp can be used interactively .

FTP [-v] [-d] [-i] [-n] [-g] [-s
:filename ] [-a] [-w :windowsize ] [-A] [host]

  -v             Suppresses display of remote server responses
.
  -n             Suppresses auto-login upon initial connection
.
  -i             Turns 
off  interactive prompting during multiple file
                 transfers
.
  -d             Enables debugging
.
  -g             Disables filename globbing 
( see GLOB  command ).
  -s
:filename     Specifies a text file containing FTP commands ;  the
                 commands will automatically 
run  after FTP starts .
  -a             
Use  any local interface  when  binding data connection .
  -A             login as anonymous
.
  -w
:buffersize   Overrides the default transfer buffer size of  4096 .
  host           Specifies the host name or IP address of the remote
                 host to connect to
.

Notes:
  - mget and mput commands take y
/ n / for  yes / no / quit .
  - 
Use  Control-C to abort commands .

发现 -i 参数可以去除mget的提示,经过测试,实现了如下脚本(使用了匿名登入,如果非匿名,可以修改登入脚本):

echo   cd  autoruns > ftp . txt
echo  mget * >> ftp . txt
echo  bye >> ftp . txt
ftp -i -A -s
:ftp . txt  10.1 . 103.10

   不过,这只是下载了目录中的文件,如果有子目录,那还需要用dir命令输出,并转向输出到文本,用find来提取目录,如:

echo   cd  autoruns > ftp . txt
echo   dir >> ftp . txt
echo  bye >> ftp . txt
ftp -A -s
:ftp . txt  10.1 . 103.10  | find   " <DIR> " > result . txt
for   / " tokens=2,3* "  %%i in  ( result . txt )   do   echo  %%k

  如有子文件夹,那就要深入编写了。

  经过编写测试,实现如下脚本,运行环境WINXP SP2,运行通过,未载其它系统上测试过:

1、主要脚本ftpget.bat,更改前4个变量的相关信息,该脚本调用makeTree.bat,请参见2

rem  FTP服务器地址
set  host = 10.1 . 103.10

rem  FTP登入名,如果匿名不用改
set  user = anonymous

rem  FTP登入密码,如果匿名不用改
set  pass = 123456

rem  需要下载的FTP目录,如果下载子目录以分格
set  dirname = 目录1 子目录

set  homedir = % cd %

rem  生成FTP目录结构
del   tree . txt
start   / cmd   / c makeTree %dirname%  0
del  result* . txt

for   / " delims=/ "  %%i in  ( tree . txt )   do   (

rem  获取dirname的所有文件
rem
 =============================
cd  %homedir%
md  %%i
cd   / d %%i
echo  %user% > ftp . txt
echo  %pass% >> ftp . txt
echo   cd  %%i >> ftp . txt

rem  mget *.* 下载所有文件,但不能下载无扩展名的文件;
rem
 如果使用mget * 可以下载所有文件,但会把子目录的文件也下载过来
echo  mget * . * >> ftp . txt

echo  bye >> ftp . txt
ftp -i -A -s
:ftp . txt %host%
del  ftp . txt
rem  ==============================

)
cd  %homedir%
del   tree . txt

2、maketree.bat,生成FTP目录树

rem  生成FTP目录结构
rem
 调用方法 maketree dir1dir2 n (n>=1)
rem
 %1 == dir1dir2
rem
 %2 == n

set   / a treetime = %2 + 1
echo   %1   >> tree . txt

echo  %user%  > ftp%treetime% . txt
echo  %pass%  >> ftp%treetime% . txt
echo   cd   %1   >> ftp%treetime% . txt
echo   dir   >> ftp%treetime% . txt
echo  bye  >> ftp%treetime% . txt
ftp -A -s
:ftp %treetime% . txt %host% | find   " <DIR> " > result%treetime% . txt
for   / " tokens=2,3* "  %%i in  ( result%treetime% . txt )   do   ( start   / cmd   / c Maketree . bat  %1 %%k %treetime% )
del  result%treetime% . txt
del  ftp%treetime% . txt

 

  虽然已经实现,但仍然有小问题,就是mget *.* 不能下载无扩展名的程序;如果使用mget * 可以下载所有文件,但会把子目录的文件也下载过来。get在FTP脚本中出错也不知为何。

相关信息参考: 使用FTP 批处理脚本Ftp 子命令

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值