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