iT邦幫忙

0

於CMD下使用FTP指令,抓取檔案指令疑問

目前寫了一個.BAT去帶.TXT

.BAT

ftp -s:GET.txt

.TXT

open 123.123.123.123
test123
test123
prompt
lcd J:\TEST
mget AG01_*.txt
mget AG02_*.txt
mget AG03_*.txt
mdelete AG01_*.txt
mdelete AG02_*.txt
mdelete AG03_*.txt
quit

此批次是把檔案下載後,全數刪除掉。

我的疑問是:
因為我們會有中心主機下檔到某個資料夾,我再去該資料夾抓取檔案
檔案分為三種,以下為舉例
1.AG_01201508271028.txt
2.AG_02201508271028.txt
3.AG_03201508271028.txt
而檔案名稱會隨著時間變動,檔案每個月底會下檔一次,一次約各100-200筆,
所以總數是600筆左右。
請問,有辦法可以更有效率的下載檔案,且不必刪除已下載的檔案嗎?
之前爬文有看到可以抓取最近檔案的指令

mget -n 1 *.txt ←抓取最近一天的.txt檔

經測試後卻錯誤百出,他會下載不只1天內的檔案。
另外是否可以已FTP去判斷現在的西元年、月來做判斷是最好?
謝謝

看更多先前的討論...收起先前的討論...
建議,新增 FTP 網路磁碟機

用備份軟體下遮罩,然後備份你要的檔案到其他位置

這樣就不需要想要如何下指令,因為備份軟體的功能遠遠比指令齊全
包括各種排程功能,備份軟體也比較好操作
實際上很多備份軟體都能直接備份FTP的檔案,你自己可以試看看
flytou12 iT邦新手 5 級 ‧ 2015-08-27 13:36:19 檢舉
網路磁碟機因為一些個資安全性考慮,公司不打算使用。 但還是謝謝您的建議
阿偉 iT邦新手 2 級 ‧ 2021-10-28 15:17:46 檢舉
請問一下我也用mdelete 刪除一堆資料
我是刪除檔名日期
但我想刪除25天以前的資料
例如:20211003以前的全部要刪除
不寫迴圈的情況下 如何達到 謝謝
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
vino1
iT邦大師 1 級 ‧ 2015-08-27 14:58:50
最佳解答

這檔案是每天抓一次, 還是每個月抓一次??
我看你的說明好像是一個月下載一次...
如果..上面那樣就是貴司檔案目前實際的狀況..至少檔名中"年"跟"月"是很有規則的
如果真像我說的是每個月初下載上個月所有檔案的話,可以考慮底下下載方式
mget AG01_201507*.txt
mget AG02_201507*.txt
mget AG03_201507*.txt

.bat 內容

<pre class="c" name="code">@echo off
REM 取得今天的年、月、日 (自動補零)
SET TodayYear=%date:~0,4%
SET TodayMonthP0=%date:~5,2%
SET TodayDayP0=%date:~8,2%

REM 取得今天的年、月、日 (純數字)
REM 2010/08/03 更新:以下是為了修正 Batch 遇到 08, 09 會視為八進位的問題
IF %TodayMonthP0:~0,1% == 0 (
	SET /A TodayMonth=%TodayMonthP0:~1,1%+0
) ELSE (
	SET /A TodayMonth=TodayMonthP0+0
)

IF %TodayMonthP0:~0,1% == 0 (
	SET /A TodayDay=%TodayDayP0:~1,1%+0
) ELSE (
	SET /A TodayDay=TodayDayP0+0
)

rem echo 今天日期 %TodayYear%/%TodayMonthP0%/%TodayDayP0%

REM 取得上個月的年、月
SET /A LastMonthYear=%TodayYear%+0
SET /A LastMonthMonth=%TodayMonth%-1
SET /A LastMonthMonthP0=%LastMonthMonth%
REM 修正年份與月份的數值
IF %LastMonthMonth% EQU 0 (SET /A LastMonthYear=%thisYear%-1)
IF %LastMonthMonth% EQU 0 (SET LastMonthMonth=12)
IF %LastMonthMonth% LSS 10 (SET LastMonthMonthP0=0%LastMonthMonth%)

rem echo 上月月份 %LastMonthYear%/%LastMonthMonthP0%
SET DownloadMonth=%LastMonthYear%%LastMonthMonthP0%

REM 底下為 FTP 下載,匯入函數產生 GET.txt
del GET.txt /q
echo open 123.123.123.123 >> GET.txt
echo test123 >> GET.txt
echo test123 >> GET.txt
echo prompt >> GET.txt
echo lcd J:\TEST >> GET.txt
echo mget AG01_%DownloadMonth%*.txt >> GET.txt
echo mget AG02_%DownloadMonth%*.txt >> GET.txt
echo mget AG03_%DownloadMonth%*.txt >> GET.txt
echo quit >> GET.txt

ftp -s:GET.txt
看更多先前的回應...收起先前的回應...
flytou12 iT邦新手 5 級 ‧ 2015-08-27 15:48:59 檢舉

你好,跑過後發現FTP部分會一直卡住登不進去
echo open 123.123.123.123 >> GET.txt
echo test123 >> GET.txt
echo test123 >> GET.txt
這部分的問題是出在哪裡?

vino1 iT邦大師 1 級 ‧ 2015-08-27 15:55:39 檢舉

你應該是要調整內容符合你的現況
因為我是每次執行批次檔, 都先砍掉你原來的 GET.txt 檔案,
然後利用函數把 年跟月 匯入產生一個新的 GET.txt 檔案
建議先檢查 GET.txt 有無產生...

vino1 iT邦大師 1 級 ‧ 2015-08-27 15:56:45 檢舉

你不會是照抄吧, 至少你 ftp 位址, 登入帳密要改吧~

flytou12 iT邦新手 5 級 ‧ 2015-08-27 15:58:05 檢舉

再跑bat的時候是先刪除原來的GET沒錯,
但再登入那一區塊不知為何無法登入成功,
已有轉換至FTP,但在嘗試下載AG01_檔案時,
一直顯示未登入(Please login with USER and PASS.)

flytou12 iT邦新手 5 級 ‧ 2015-08-27 16:02:27 檢舉

當然不是照抄,我知道那FTP IP 及使用者更改
但卻變成無法登入了!?

vino1 iT邦大師 1 級 ‧ 2015-08-27 16:07:21 檢舉

但它秀的錯誤訊息是要你登入...所以?!

flytou12 iT邦新手 5 級 ‧ 2015-08-27 16:09:10 檢舉

這部分我可能要再研究一下,
溫欸我手動敲帳密是沒問題的,但跑Bat後他卻顯示沒有登入成功
530 User cannot log in.

我再研究看看,謝謝

flytou12 iT邦新手 5 級 ‧ 2015-08-27 16:13:36 檢舉
flytou12 iT邦新手 5 級 ‧ 2015-08-27 16:14:07 檢舉

vino1 iT邦大師 1 級 ‧ 2015-08-27 16:25:50 檢舉

我知道了...我知道問題了...GET.txt檔案中每一行後面都多了兩個空白字元
所以造成帳密後面都有多空白字元, 我想這應該就是問題~
請你將批次檔每個 >> 前後的空格都刪除

<pre class="c" name="code">REM 底下為 FTP 下載
del GET.txt /q
echo open 123.123.123.123>>GET.txt
echo test123>>GET.txt
echo test123>>GET.txt
echo prompt>>GET.txt
echo lcd J:\TEST>>GET.txt
echo mget AG01_%DownloadMonth%*.txt>>GET.txt
echo mget AG02_%DownloadMonth%*.txt>>GET.txt
echo mget AG03_%DownloadMonth%*.txt>>GET.txt
echo quit>>GET.txt
flytou12 iT邦新手 5 級 ‧ 2015-08-27 16:29:40 檢舉

已找到問題!
REM 底下為 FTP 下載,匯入函數產生 GET.txt
del GET.txt /q
echo open 123.123.123.123 >> GET.txt
echo test123 >> GET.txt 「ftp登入時,帳號判定為test123 」 多空了一格
echo test123 >> GET.txt 「ftp登入時,密碼判定為test123 」 多空了一格
echo prompt >> GET.txt
echo lcd J:\TEST >> GET.txt

非常感謝!!

flytou12 iT邦新手 5 級 ‧ 2015-08-27 16:30:11 檢舉

哈哈,沒錯,我剛剛也是卡在這裡很久,
謝謝你詳細的解說!

阿偉 iT邦新手 2 級 ‧ 2021-10-28 15:17:38 檢舉

請問一下我也用mdelete 刪除一堆資料
我是刪除檔名日期
但我想刪除25天以前的資料
例如:20211003以前的全部要刪除
不寫迴圈的情況下 如何達到 謝謝

2
wiseguy
iT邦超人 1 級 ‧ 2015-08-27 14:48:53

既然不想刪原始檔,又要有效率下載,幹嘛不考慮同步軟體?還可以設定排程自動同步,不是就如你所需嗎?例如免費的 FreeFileSync 就支援 FTP 同步:
http://www.azofreeware.com/2009/09/freefilesync-22.html

953904 iT邦新手 3 級 ‧ 2015-08-28 14:56:51 檢舉

同步軟體最大的問題之一是若檔案異常時要如何追問題?
若檔案是訂單,用同步軟體是很危險的吧。
一般而言,對於重要的檔案交換,個人還是建議用傳統的FTP是比較可靠的。

像我用雲端軟體做同步某個資料夾,我改了某個檔案的檔名,結果自動給我生出個原檔名的檔案,@@"~,所以同步軟體比較適合用於備份,目前而言,並不太適合用於須正確無誤的營運線上。

我要發表回答

立即登入回答