現在有一個需求就是把遠程某個文件下面的圖片,下載到本地,並且刪除下載成功的的文件,而且遠程目錄下的那個圖片會隨時增加。假設一下如果所有的腳本都寫好了,那么就需要調用windows上的計划任務定時執行腳本就ok了,Linux上利用cronjob 同樣可以做到。大體的實現思路如下,當然了不止這一種方式。
- 在遠程服務器上搭建ftp server ,例如這里在遠程服務上的 images 作為下載目錄。搭建ftp server 最簡單的方式就是用FileZilla Server 這個工具去搭建,很方便,零配置。
- 在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 計划任務中,這個我在這里就不說明的,如果不熟悉可以在網上搜索看看。