使用FTP下载目录,即FTP命令批量自动下载的bat文件

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/q 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 /f "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 /w cmd /c makeTree %dirname% 0
del result*.txt

for /f "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 /f "tokens=2,3*" %%i in (result%treetime%.txt) do (start /w cmd /c Maketree.bat %1%%k %treetime%)
del result%treetime%.txt
del ftp%treetime%.txt

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

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

(0)

相关推荐

  • windows下定时利用bat脚本实现ftp上传下载

    前言: 工作中可能会遇到以下情况,利用windows作为中转,来实现两台linux服务器的文件传输. 实现步骤: 1.FTP上传和下载的bat脚本. 脚本分为两部分:可执行bat脚本和ftp命令文件: 可执行bat脚本: @echo off ftp -s:D:\ftp\ftp.txt ftp命令ftp.txt: open 192.168.1.166 ftp-user passwd prompt off lcd D:\ftp cd /home/myftp mget * close open 10.

  • 实现自动上传文件到ftp服务器的BAT脚本分享

    复制代码 代码如下: @Echo Off Echo open ip_address [port] >ftp.up Echo [username]>>ftp.up Echo [password]>>ftp.up Echo Cd .\ >>ftp.up Echo binary>>ftp.up Echo put "C:\ExAdminAuditLog.txt">>ftp.up Echo bye>>ftp.up FT

  • 批处理bat下载FTP服务器上某个目录下的文件

    本代码以下载FTP服务器上某个目录下的所有文件为例. 如果需要下载某个目录下的.txt类型的所有文件,请把 mget *.* 改成 mget *.txt 如果需要下载某个目录下的某一个文件a.txt,请把 mget *.* 改成 get a.txt @echo off rem 指定FTP用户名 set ftpUser=FTPUSERNAME rem 指定FTP密码 set ftpPass=FTPPASSWORD rem 指定FTP服务器地址 set ftpIP=192.168.0.2 rem 指

  • 批处理bat下载FTP服务器上指定天数之前的文件

    @echo off rem 指定FTP用户名 set ftpUser=asx rem 指定FTP密码 set ftpPass=asx-asx rem 指定FTP服务器地址 set ftpIP=172.19.103.7 rem 指定待下载的文件位于FTP服务器的什么位置 set ftpFolder=/export/home/PROD/ntcdata rem 指定从FTP下载下来的文件存放到什么地方 set LocalFolder=E:/Temp rem 指定下载几天前的文件 set DaysAgo

  • Bat脚本处理ftp超强案例分析

    前言: 公司有几百台windows服务器,每次程序更新,如果是一台台拷数据,只怕安排十个人,一天都不一定做得完,所以就必须研究个全自动更新方案来,于是就想到了FTP,做个主FTP站,在几百台客户机上启动BAT脚本,每30秒检测一次,如果主站有更新程序,就自动下载更新,几分钟内,上400台windows服务器,都可以全自动更新程序完毕,相当实用,现把当初研究BAT的脚本思路贴出来,希望对大批量运维人员一个方向.当然,批量更新服务器,每个公司有它自己的解决办法,这个BAT的方式不是最优的,可以用sh

  • linux和windows下的自动ftp脚本(shell bat)

    一.先来看linux下的: 复制代码 代码如下: #! /bin/bashcd /ftp/CURRENTDATE=` date +%Y%m%d `YESTERDAY=` date -d yesterday +%Y%m%d `THREEDAYAGO=` date -d '3 days ago' +%Y%m%d `#echo $TWODAYAGOftp -n -i 34.97.34.3 << !user ftpuser ftpuserbinmput $YESTERDAY.*delete $THRE

  • 备份文件并上传至FTP服务器的bat代码

    定时备份文件并FTP上传至备份服务器 复制代码 代码如下: @echo offcolor 0ftitle 定时备份文件并FTP上传至备份服务器 rem 要备份的文件夹echo:set /p bak_webFile=        请将要上传的文件(夹)拖到此处= rem 当前日期(格式YYYYMMDD)set bak_date=%date:~0,4%%date:~5,2%%date:~8,2% rem ftp信息set bak_ftpServer=202.96.189.52set bak_ftp

  • 使用FTP下载目录,即FTP命令批量自动下载的bat文件

    FTP不支持目录的下载,不过FTP命令提供了mget命令,允许多文件下载,但每下载一个文件都需要确认,不能自动完成.本文主要介绍使用批处理,结合FTP的相关命令来实现批量文件的下载,以便达到目录下载的目的. 大致想法如下: ftp -s:filename hosts >result.txt 执行脚本,并将结果定向输出到result.txt脚本内容,如cd mydirlsbye可以将mydir命令列出然后使用批处理分析result.txt从150 Opening ASCII mode data c

  • 使用forfiles命令批量删除N天前文件

    在整理手上几台SQL SERVER 2000的数据库备份时,一方面为了方便快速还原数据库,另外一方面为了备份冗余.备份方式统一(先备份到本地,然后收上磁带),将以前通过Symantec Backup Exec直接备份上带的作业改成了如下方式:     Step 1: 通过数据库维护计划将备份生成在本地磁盘M,完整备份保留2天,事务日志备份保留3天 M:\DB_BACKUP\FULL_BACKUP             M:\DB_BACKUP\LOG_BACKUP Step 2:  备份完成后

  • 用批处理实现批量安装字体的bat文件

    复制代码 代码如下: @echo off color 3f title 字体批量安装脚本 echo A|xcopy *.ttf %windir%\fonts\ echo 安装完毕,任意键退出.... pause>nul exit echo a就是全部覆盖的,使用了通道.原理就是复制当面目录中的ttf复制到fonts目录,实现字体的安装,比较简单,不懂的可以留言.

  • 使用 iisftpdr.vbs 创建 FTP 虚拟目录的方法

    应用到: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1 可以使用命令行脚本 iisftpdr.vbs(存储在 systemroot\System32\ 中)在运行带有 IIS 6.0 的 Windows Server 2003 家族成员的本地或远程计算机上创建新的 FTP 虚拟目录.该命令不创建或破坏内容,而只是简单地设置虚拟目录结构和 IIS 配置文件. 如果没有iisftpdr.vbs文件可

  • 使用 Iisftpdr.vbs 删除FTP虚拟目录(支持本地与远程)

    应用到: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1 可以使用命令行脚本 iisftpdr.vbs(存储在 systemroot\System32 中)在运行带有 IIS 6.0 的 Windows Server 2003 家族成员的本地或远程计算机上删除 FTP 虚拟目录.该命令不创建或破坏内容,而只是删除虚拟目录结构. 不应使用此命令删除 FTP 站点,因为这些站点可能仍被列出但已部分禁用

  • go自动下载所有的依赖包go module使用详解

    今天在学习dubbo-go的时候,下载了dubbo-go的example,依赖的包太多了,之前都是手动下载某个依赖的包,现在手动一个一个 go get 那太麻烦了.因为我是搞java的,刚开始用go的时候感觉有点奇怪,go代码所依赖的所有的第三方库都放在GOPATH这个目录下面,这就导致了同一个库只能保存一个版本的代码.如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?总不能改包名吧,看了一下 dubbo-samples/golang/的代码 发现了有个 go.mod文件,百度一下 g

  • Linux ftp 命令行中下载文件get与上传文件put的命令应用详解

    介绍:从本地以用户anok登录的机器192.168.0.16上通过ftp远程登录到192.168.0.6的ftp服务器上,登录用户名是peo.以下为使用该连接做的实验. 查看远程ftp服务器上用户peo相应目录下的文件所使用的命令为:ls,登录到ftp后在ftp命令提示符下查看本地机器用户anok相应目录下文件的命令是:!ls.查询ftp命令可在提示符下输入:?,然后回车. 1.从远程ftp服务器下载文件的命令格式: get  远程ftp服务器上当前目录下要下载的文件名  [下载到本地机器上当前

  • python ftp 按目录结构上传下载的实现代码

    具体代码如下所示: #!/usr/bin/python # coding=utf-8 from ftplib import FTP import time import os def __ftp_upload(ftp,local,remote,isDel=False): if os.path.isdir(local): for f in os.listdir(local): if os.path.isdir(local+f): try: ftp.cwd(remote+f) except: ftp

  • 基于python实现FTP文件上传与下载操作(ftp&sftp协议)

    前言 FTP(File Transfer Protocol)是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).用户可以通过它把自己的PC机与世界各地所有运行FTP协议的服务器相连,访问服务器上的大量程序和信息.如果用户需要将文件从自己的计算机上发送到另一台计算机上,可使用FTP上传(upload)或(put)操作,而更多种的情况是用户使用FTP下载(download)或获取(get)操作从FTP服务器上下载文件 在传输文件时我们

  • 使用 Iisftpdr.vbs 列出FTP虚拟目录(支持远程与本地)

    应用到: Windows Server 2003, Windows Server 2003 R2, Windows Server 2003 with SP1 可使用命令行脚本 iisftpdr.vbs(存储在 systemroot\system32 中)列出运行带有 IIS 6.0 的 Windows Server 2003 家族的成员的本地或远程计算机上的 FTP 虚拟目录. /query 操作只显示虚拟目录而不显示物理目录.而且,它只显示位于 FTP 站点或路径根目录下的虚拟目录且不进行递归

随机推荐