zoukankan      html  css  js  c++  java
  • windows bat脚本实现ftp自动下载 删除

    现在有一个需求就是把远程某个文件下面的图片,下载到本地,并且删除下载成功的的文件,而且远程目录下的那个图片会随时增加。假设一下如果所有的脚本都写好了,那么就需要调用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:atftp
    set LOG_FILE=%BASE_PATH%ftpgetfile.log
    
    set FLAG_FILE=%BASE_PATH%	mp.tmp
    set SA~VE_PATH=%BASE_PATH%download
    set TMP_PATH=%BASE_PATH%	emp
    REM 远程的目录
    set REMOTE_PATH=/images
    REM 程序开始运行
    echo =========================================================== >> %LOG_FILE%
    set mydate=%date:~0,10% %time:~0,8%
    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 程序执行之前设置的标志位 为 0
    echo 0 > %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=0
    FOR /F  "delims=" %%i IN (%BASE_PATH%filelist.tmp) DO (
        set /a count+= 1
    )
    if %count% == 0 (
        echo "NO files need download!" >> %LOG_FILE%
        exit
    )
    dir /B %TMP_PATH%*.* >> %LOG_FILE%
    REM 把下载的文件拷贝到其它的目录
    move /Y %TMP_PATH%*.* %SA~VE_PATH%
    set num=1
    set filelist=
    FOR /F "delims=" %%i IN (%BASE_PATH%filelist.tmp) DO (
        set filelist=!filelist! %%i
        REM 以5个文件为一组进行删除
        set /a tmp = !num! %% 5
        if !tmp! == 0 (
            call %BASE_PATH%
    emovefile.bat "!filelist!" %LOG_FILE% %REMOTE_PATH%
            set filelist=
        ) else (
            REM 如果文件的总个数与 num的数相等,并且不能达到5个文件为一组,那么就直接删除
            if !count! LEQ !num! (
                call %BASE_PATH%
    emovefile.bat "!filelist!" %LOG_FILE% %REMOTE_PATH%
                set filelist=
            )
        )
        set /a num+= 1
    )
    endlocal 
    REM 程序执行完成之后设置标志位为1
    echo 1 > %FLAG_FILE%
    REM del %BASE_PATH%filelist.tmp 删除下载的文件列表
    set mydate=%date:~0,10% %time:~0,8%
    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 %3>>ftp.txt REM 这里主要处理掉 file list 中的前后双引号 set tmp=%1 set "tmp=%tmp:"=%"
    REM 如果要关闭交互,那么就用 prompt off
    REM echo prompt off>>ftp.txt REM mdelete 删除的格式 mdelete 1.txt 2.txt 3.txt echo mdelete %tmp%>>ftp.txt echo bye>>ftp.txt echo quit>>ftp.txt echo exit>>ftp.txt ftp -i -s:ftp.txt >>%2 del ftp.txt

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

  • 相关阅读:
    【转】网络字节序与主机字节序
    VC之美化界面篇 (转)
    VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题(转)
    符验手记
    一友人昨夜接到电话,发生何事
    [转]众VC论道IT峰会:投资是否靠运气
    路过一个小摊,看到一个有趣的现象
    PJSUA提示要注册线程的解决办法
    彩票股票金融与运气之研究(五) 明敌
    随手测一局婚姻,留验
  • 原文地址:https://www.cnblogs.com/stackflow/p/3917795.html
Copyright © 2011-2022 走看看