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:\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:~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%\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+= 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 計划任務中,這個我在這里就不說明的,如果不熟悉可以在網上搜索看看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM