现在有一个需求就是把远程某个文件下面的图片,下载到本地,并且删除下载成功的的文件,而且远程目录下的那个图片会随时增加。假设一下如果所有的脚本都写好了,那么就需要调用windows上的计划任务定时执行脚本就ok了,Linux上利用cronjob 同样可以做到。大体的实现思路如下,当然了不止这一种方式。

  1. 在远程服务器上搭建ftp server ,例如这里在远程服务上的 images 作为下载目录。搭建ftp server 最简单的方式就是用FileZilla Server 这个工具去搭建,很方便,零配置。
  2. 在client端编写 脚本,首先实现可以从远程服务器上下载,其次再把下载成功的文件到远程服务器上进行删除,这里的细节需要注意:

a.首先把下载完成的文件的列表写入到一个临时文件中 例如文件 filelist.tmp,同时把下载到临时目录中的文件移动到一个一个正式目录 例如 download 目录

b.其次删除文件的时候就按照这个 filelist.tmp 文件中文件list, 由于因windows下不能直接将参数传给ftp脚本函数,所以删除文件就采用分批删除,例如一次删除    10个文件,当然这个你可以自己零活控制 , 这里主要用到了ftp 命令中的 mdelete 这个方法,同时可以删除多个文件。

3. 然后根据你的需求,把这个脚本添加到任务计划中。

这个程序包含 2个 脚本 ,getfile.bat 和 removefile.bat

getfile.bat的代码如下:

@echo off
REM 配置基本盘符,主目录和文件存放目录
set BASE=d:
set BASE_PATH=D:\bat\ftp
set LOG_FILE=%BASE_PATH%\ftpgetfile.log set FLAG_FILE=%BASE_PATH%\tmp.tmp
set SA~VE_PATH=%BASE_PATH%\download
set TMP_PATH=%BASE_PATH%\temp
REM 远程的目录
set REMOTE_PATH=/images
REM 程序开始运行
echo =========================================================== >> %LOG_FILE%
set mydate=%date:~,% %time:~,%
echo "Program is running start time:%mydate%" >> %LOG_FILE%
%BASE%
if not exist %BASE_PATH% (
mkdir %BASE_PATH%
)
if not exist %SA~VE_PATH% (
mkdir %SA~VE_PATH%
)
if not exist %TMP_PATH% (
mkdir %TMP_PATH%
)
cd %TMP_PATH%
REM 程序执行之前设置的标志位 为
echo > %FLAG_FILE%
if not exist %SA~VE_PATH% (
echo 无法找到标志文件%SA~VE_PATH% >> %LOG_FILE%
goto _END
)
ftp -s:"%BASE_PATH%\getfile.ftp" >> %LOG_FILE%
echo 本次获得的文件如下:>> %LOG_FILE%
dir /B %TMP_PATH%\*.* > %BASE_PATH%\filelist.tmp
setlocal EnableDelayedExpansion
set count=
FOR /F "delims=" %%i IN (%BASE_PATH%\filelist.tmp) DO (
set /a count+=
)
if %count% == (
echo "NO files need download!" >> %LOG_FILE%
exit
)
dir /B %TMP_PATH%\*.* >> %LOG_FILE%
REM 把下载的文件拷贝到其它的目录
move /Y %TMP_PATH%\*.* %SA~VE_PATH%\
set num=
set filelist=
FOR /F "delims=" %%i IN (%BASE_PATH%\filelist.tmp) DO (
set filelist=!filelist! %%i
REM 以5个文件为一组进行删除
set /a tmp = !num! %%
if !tmp! == (
call %BASE_PATH%\removefile.bat "!filelist!" %LOG_FILE% %REMOTE_PATH%
set filelist=
) else (
REM 如果文件的总个数与 num的数相等,并且不能达到5个文件为一组,那么就直接删除
if !count! LEQ !num! (
call %BASE_PATH%\removefile.bat "!filelist!" %LOG_FILE% %REMOTE_PATH%
set filelist=
)
)
set /a num+=
)
endlocal
REM 程序执行完成之后设置标志位为1
echo > %FLAG_FILE%
REM del %BASE_PATH%\filelist.tmp 删除下载的文件列表
set mydate=%date:~,% %time:~,%
echo =========================================================== >> %LOG_FILE%
echo "Program is running end:%mydate%" >> %LOG_FILE%
exit

这个脚本需要一个登录ftp服务器的信息,getfile.ftp 的内容下:

open your ftp server IP
USER
PASSWORD
cd your ftp floder
prompt off
mget *.*
bye
quit
exit

removefile.bat 脚本的内容如下:

echo open 121.40.123.74>ftp.txt
echo mht.cherry>>ftp.txt
echo mht.cherry>>ftp.txt
REM %1 代表第一个参数 %2代表第二个参数 依次类推
echo cd %>>ftp.txt
REM 这里主要处理掉 file list 中的前后双引号
set tmp=%
set "tmp=%tmp:"=%"
REM 如果要关闭交互,那么就用 prompt off
REM echo prompt off>>ftp.txt
REM mdelete 删除的格式 mdelete .txt .txt .txt
echo mdelete %tmp%>>ftp.txt
echo bye>>ftp.txt
echo quit>>ftp.txt
echo exit>>ftp.txt
ftp -i -s:ftp.txt >>%
del ftp.txt

到这里,功能已经完成。接下来就是把getfile.bat 这个脚本添加到 windows 计划任务中,这个我在这里就不说明的,如果不熟悉可以在网上搜索看看。

windows bat脚本实现ftp自动下载 删除的更多相关文章

  1. windows下定时利用bat脚本实现ftp上传和下载

    前言: 工作中可能会遇到以下情况,利用windows作为中转,来实现两台linux服务器的文件传输. 实现步骤: 1.FTP上传和下载的bat脚本. 脚本分为两部分:可执行bat脚本和ftp命令文件: ...

  2. [转]Bat脚本处理ftp超强案例解说

    Bat脚本处理ftp超强案例解说 转自:http://369369.blog.51cto.com/319630/842341   前言:   公司有几百台windows服务器,每次程序更新,如果是一台 ...

  3. Bat脚本处理ftp超强案例解说

    Bat脚本处理ftp超强案例解说 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://369369.blog.51cto.com/31 ...

  4. windows bat脚本编写

    windows批处理 (cmd/bat) 编程详解 开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建.编辑和查看.两者所用的命令行代码 ...

  5. Windows bat脚本的for语句

    Windows bat脚本的for语句基本形态如下: 在cmd窗口中:for %I in (command1) do command2 在批处理文件中:for %%I in (command1) do ...

  6. windows cmd ftp 自动下载

    1.编写ftp的bat脚本: set year=%,% set day=%,%%,%%,% mkdir d:\ftp\%,% mkdir d:\ftp\%,%\%,%%,%%,% del d:\ftp ...

  7. linux脚本:ftp自动传输文件

    使用Shell脚本实现ftp的自动上传下载 http://liwenge.iteye.com/blog/566515 open 192.168.1.171 user guest 123456cd /h ...

  8. java 调用windows bat脚本

    当我们需要在java程序中调用外部程序,我们可用通过Runtime.exec()调用来完成. The class java.lang.Runtime features a static method ...

  9. 在windows bat脚本(batch)中延时

    编写bat脚本时,有事我们希望在指令和指令之间,加入延时.例如当一条指令执行后,windows需要一定时间来响应的情况. 以下是一种实现方法,通过ping 指令来实现,5表示ping5次,就是延时5秒 ...

随机推荐

  1. mybaits 学习

    mybaits  学习(一) 注意:如果建的是web项目,run as java application 参考http://www.cnblogs.com/xdp-gacl/p/4261895.htm ...

  2. 2dx关于js响应layer触摸消息的bug

    cocos2dx关于js响应layer触摸消息的bug cocos2d-x 3.7 问题描述: 目前这个版本中(3.7),c++层的layer触摸消息只能通过消息的方式发送给js,不能像lua一样直接 ...

  3. nodejs学习第一天

    //按照nodejs文档上第一页的例子敲了一遍运行了 迷茫 先这样吧 慢慢来 const http = require('http'); const host = '127.0.0.1'; const ...

  4. 【阿里云产品公测】离线归档OAS,在也不用备份担心空间了

    作者:阿里云用户 莫须有3i 1 起步 1.1 初识OAS 啥是OAS,请看官方说明: 引用 开放归档服务(Open Archive Service,简称OAS),致力于提供低成本.高可靠的数据归档服 ...

  5. 【Mood-8】IT男!五更天!

    男人从毕业到30岁之间所承受的叠加的压力,赡养父母.结婚生子.升职加薪.工作压力.生活质量,这些东西可以压得我们喘不过起来,也成为我们成长的动力, 我们累,但不说累,我们闷着头做事儿,不张扬,但每个都 ...

  6. PHP 中mysql如何实现事务提交?

    事务就是指对数据库的多次修改,要么全部成功,要么全部失败,不能出现部分修改成功,部分修改失败的情况. PHP下操作mysql数据库要实现事务提交,需注意以下方面: 1, 数据库表存储引擎类型设置为in ...

  7. 将Winform程序快速转换为在浏览器中运行的程序

    http://www.codeproject.com/Articles/31429/Embedding-a-NET-WinForms-Application-in-an-Interne 详见以上文章. ...

  8. 剑指Offer15 合并两个已排序链表

    /************************************************************************* > File Name: 15_MergeT ...

  9. 使用Xcode5开发时的icon取消高光效果

    .在General中App Icons 使用Source--> AppIcon .在Images.xcassets 中依次添加对应尺寸的icon. .选中AppIcon ,在右侧第三个按钮下,勾 ...

  10. JS/jQuery宽高的理解和应用

    1.widows:窗口.window对象可省略 2.document对象是window对象的一部分 浏览器的Html文档成为Document对象 window.location===document. ...