FTP不支持目录的下载,不过FTP命令提供了mget命令,允许多文件下载,但每下载一个文件都需要确认,不能自动完成。本文主要介绍使用批处理,结合FTP的相关命令来实现批量文件的下载,以便达到目录下载的目的。
大致想法如下:
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
ftp -s:filename hosts >result.txt 执行脚本,并将结果定向输出到result.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
脚本内容,如
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
cd mydir
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
ls
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
bye
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
可以将mydir命令列出
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
然后使用批处理分析result.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
从150 Opening ASCII mode data connection for file list.的下一行开始算,直到226 Transfer complete都是要下载的内容
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
然后用批处理加ftp脚本,使用get命令逐个下载
但实际过程中发现,在FTP脚本中使用get有问题,提示参数错误,无法使用。
查看了ftp的帮助ftp -?
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
G:>ftp -?
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
Transfers files to and from a computer running an FTP server service
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
(sometimes called a daemon). Ftp can be used interactively.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-w:windowsize] [-A] [host]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-v Suppresses display of remote server responses.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-n Suppresses auto-login upon initial connection.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-i Turns off interactive prompting during multiple file
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
transfers.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-d Enables debugging.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-g Disables filename globbing (see GLOB command).
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-s:filename Specifies a text file containing FTP commands; the
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
commands will automatically run after FTP starts.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-a Use any local interface when binding data connection.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-A login as anonymous.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
-w:buffersize Overrides the default transfer buffer size of 4096.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
host Specifies the host name or IP address of the remote
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
host to connect to.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
Notes:
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
- mget and mput commands take y/n/q for yes/no/quit.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
- Use Control-C to abort commands.
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
发现 -i 参数可以去除mget的提示,经过测试,实现了如下脚本(使用了匿名登入,如果非匿名,可以修改登入脚本):
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo cd autoruns>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo mget *>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo bye>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
ftp -i -A -s:ftp.txt 10.1.103.10
不过,这只是下载了目录中的文件,如果有子目录,那还需要用dir命令输出,并转向输出到文本,用find来提取目录,如:
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo cd autoruns>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo dir>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo bye>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
ftp -A -s:ftp.txt 10.1.103.10 |find "<DIR>">result.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
for /f "tokens=2,3*" %%i in (result.txt) do echo %%k
如有子文件夹,那就要深入编写了。
经过编写测试,实现如下脚本,运行环境WINXP SP2,运行通过,未载其它系统上测试过:
1、主要脚本ftpget.bat,更改前4个变量的相关信息,该脚本调用makeTree.bat,请参见2
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem FTP服务器地址
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
set host=10.1.103.10
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem FTP登入名,如果匿名不用改
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
set user=anonymous
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem FTP登入密码,如果匿名不用改
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
set pass=123456
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem 需要下载的FTP目录,如果下载子目录以分格
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
set dirname=目录1子目录
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
set homedir=%cd%
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem 生成FTP目录结构
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
del tree.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
start /w cmd /c makeTree %dirname% 0
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
del result*.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
for /f "delims=/" %%i in (tree.txt) do (
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem 获取dirname的所有文件
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem =============================
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
cd %homedir%
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
md %%i
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
cd /d %%i
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo %user%>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo %pass%>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo cd %%i>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem mget *.* 下载所有文件,但不能下载无扩展名的文件;
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem 如果使用mget * 可以下载所有文件,但会把子目录的文件也下载过来
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo mget *.*>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo bye>>ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
ftp -i -A -s:ftp.txt %host%
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
del ftp.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem ==============================
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
)
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
cd %homedir%
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
del tree.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
2、maketree.bat,生成FTP目录树
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem 生成FTP目录结构
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem 调用方法 maketree dir1dir2 n (n>=1)
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem %1 == dir1dir2
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
rem %2 == n
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
set /a treetime=%2+1
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo %1 >>tree.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo %user% >ftp%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo %pass% >>ftp%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo cd %1 >>ftp%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo dir >>ftp%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
echo bye >>ftp%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
ftp -A -s:ftp%treetime%.txt %host% |find "<DIR>">result%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
for /f "tokens=2,3*" %%i in (result%treetime%.txt) do (start /w cmd /c Maketree.bat %1%%k %treetime%)
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
del result%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
del ftp%treetime%.txt
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
[img]http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif[/img]
虽然已经实现,但仍然有小问题,就是mget *.* 不能下载无扩展名的程序;如果使用mget * 可以下载所有文件,但会把子目录的文件也下载过来。get在FTP脚本中出错也不知为何。
相关信息参考: [url=http://support.microsoft.com/default.aspx?scid=kb;zh-cn;96269]
使用FTP 批处理脚本[/url],[url=http://www.microsoft.com/technet/prodtechnol/windowsserver2003/zh-chs/library/serverhelp/258062c8-790d-4772-a763-f8ebec886877.mspx]
Ftp 子命令[/url]