標籤:style blog color io 檔案 for ar art
現在有一個需求就是把遠程某個檔案下面的圖片,下載到本地,並且刪除下載成功的的檔案,而且遠程目錄下的那個圖片會隨時增加。假設一下如果所有的指令碼都寫好了,那麼就需要調用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 offREM 配置基本盤符,主目錄和檔案存放目錄set BASE=d:set BASE_PATH=D:\bat\ftpset LOG_FILE=%BASE_PATH%\ftpgetfile.logset FLAG_FILE=%BASE_PATH%\tmp.tmpset SA~VE_PATH=%BASE_PATH%\downloadset TMP_PATH=%BASE_PATH%\tempREM 遠端目錄set REMOTE_PATH=/imagesREM 程式開始運行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 程式執行之前設定的標誌位 為 0echo 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 EnableDelayedExpansionset count=0FOR /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=1set 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 程式執行完成之後設定標誌位為1echo 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 USERPASSWORDcd your ftp floderprompt offmget *.*byequitexit
removefile.bat 指令碼的內容如下:
echo open 121.40.123.74>ftp.txtecho mht.cherry>>ftp.txtecho mht.cherry>>ftp.txt
REM %1 代表第一個參數 %2代表第二個參數 依次類推echo cd %3>>ftp.txtREM 這裡主要處理掉 file list 中的前後雙引號set tmp=%1set "tmp=%tmp:"=%"REM echo prompt off>>ftp.txt REM mdelete 刪除的格式 mdelete 1.txt 2.txt 3.txt echo mdelete %tmp%>>ftp.txt echo bye>>ftp.txtecho quit>>ftp.txtecho exit>>ftp.txtftp -i -s:ftp.txt >>%2del ftp.txt
到這裡,功能已經完成。接下來就是把getfile.bat 這個指令碼添加到 windows 計劃任務中,這個我在這裡就不說明的,如果不熟悉可以在網上搜尋看看。