練功房推薦書單

  • 猛虎出柙雙劍合璧版:最新 OCA / OCP Java SE 7 Programmer 專業認證
  • 流浪教師存零股存到3000萬
  • SCJP 6.0認證教戰手冊(第二版)Oracle Certified Professional Java Programmer(附光碟)
  • 小資女艾蜜莉:我的資產翻倍存股筆記
文章發表人是: starzine
討論區首頁 » 個人資料 starzine » 文章發表人是 starzine
內容
andowson wrote:starzine您好:
我給的範例確實是只能在本機端執行,取得本機端的檔案名稱,而您所需要的是取得遠端檔案伺服器目錄下的檔案清單。
可以在sftp下執行目錄排序的指令如下(日期最近的會排在上面)
ls -lt
但接下來可能你會問要如何從psftp將這個指令的結果(目錄內的檔案清單)傳回,好讓我們可以再加以過濾出某個日期範圍內的檔案?

你先想一下,好好的想一 下.... smilie

你不知道,我也不知道, smilie
這個問題可能已經超出光靠DOS Batch語法就能完成的事情了。

還是再問一次,有沒有可能改為規範遠端檔案伺服器上檔案的命名方式,否則我想就只有老老實實去寫程式來處理會比較快。

當問題複雜到一個程度時,還是真得要寫個程式來執行這個任務。(如何寫這個程式我就不在這邊討論,可以參考http://www.andowson.com/posts/list/199.page)



大大您好:
謝謝您的指教~
我想,這的確是有點難,可能需要寫程式來解決...
我來另外想辦法好了,謝謝您囉!
有機會再請教! smilie
andowson wrote:
另外我不知道你用cd \的原因為何,是否可以試著把cd \ 改為cd ..
將原第26行改為
echo cd ..>> ftpscript.txt


大大您好:
謝謝您的協助,後來經過測試後,發現第26行改成這樣就行了

echo cd >> ftpscript.txt

也就是說psftp好像只懂得cd
而不懂得cd..或cd\


這也是經過實驗之後才得到的結果。

另外,關於系統日期的部分,
我是想要在透過psftp連線到遠端的主機上,得到遠端主機上每個資料夾的修改日期。
再以遠端主機上的資料夾以修改日期排序。
再進入各個資料夾中抓取該修改日期之資料
想抓取系統日期的前一天的資料,但其檔名不見得係以修改日期來命名。

不過發現psftp似乎沒有支援相關指令可以用日期來排序。

目前也只找到ls 和dir可以使用。
但是ls 及dir 似乎沒有更進階的指令來作為排序的動作。(ex.dir -D之類的)
好像都無法按照日期排序。
目前好像只能用資料夾名稱排序。

所以似乎沒辦法使用大大下方所寫的程式。
大大所提供的程式,是否只能適用於本機端呢?

還是說,還有什麼方法呢?
謝謝大大囉!
說明如下:
將原8~11行搬移至第2行以取得year month day變數的定義
增加第7行, 修正day變數尾端有空白字串的bug
刪除(這裡我先用rem註解掉)原程式中的19-20行
rem echo open %FTPSERVER% > ftpscript.txt
rem echo user %USERNAME% %PASSWORD% >> ftpscript.txt

同時修改原第21行如下:
echo lcd %BACKUPDIR% > ftpscript.txt

另外我不知道你用cd \的原因為何,是否可以試著把cd \ 改為cd ..
將原第26行改為
echo cd ..>> ftpscript.txt


參考資料:
幾個在寫 MS-DOS batch script 時好用的動作


大大您好:
謝謝您的建議,我會把程式再稍做修改。
但有一個問題想請教,要如何抓取系統日的檔案呢?
也就是說,如果今天是1/9日,我想抓取修改日期是1/6日的資料,但檔案名稱不見得是0106的資料。
請問有辦法可以做的到嗎?
還有,若是有這樣的問題時,若在Google上欲搜尋,應該下什麼樣的關鍵字呢?
麻煩您囉!
andowson wrote:starzine您好:
可否先將bat檔中的這一行註解掉:
del ftpscript.txt

方法就是前面加上rem,如下:
rem del ftpscript.txt

然後你再執行一次,接著你把ftpscript.txt和log檔都傳上來,比較方便除錯,謝謝~

大大您好:
我的整個程式是這樣的寫法
@echo off
set BACKUPDIR=s:\upload
set BACKUPDIR2=s:\uploadbackup
set BACKUPFILE=%BACKUPDIR2%\%year%%month%%day%
set FTPDIR2=FundX
set LOGFILE=%year%%month%%day%_backup.log

echo wscript.echo dateadd("d",-2,date) >%tmp%\tmp.vbs
for /f "tokens=1-3 delims=/ " %%a in ('cscript /nologo %tmp%\tmp.vbs') do (set year=%%a& set month=%%b& set day=%%c)
    if %month% LEQ 9 set month=0%month%
    if %day% LEQ 9 set day=0%day%

echo. | date | findstr "現在日期" >> %LOGFILE%
echo. | time | findstr "現在時間" >> %LOGFILE%

:ftpsession
for /f "tokens=1-3 delims= " %%i in (ftp.cfg) do (set FTPSERVER=%%i&set USERNAME=%%j&set PASSWORD=%%k)

echo open %FTPSERVER% > ftpscript.txt
echo user %USERNAME% %PASSWORD% >> ftpscript.txt
echo lcd %BACKUPDIR% >> ftpscript.txt
for /f %%m in  (pbank.txt) do (
echo cd %%m>>ftpscript.txt
echo mget *%year%%month%%day%.*>> ftpscript.txt
rem echo mget *.*>> ftpscript.txt
echo cd \>> ftpscript.txt
 )
echo cd %FTPDIR2%>>ftpscript.txt
echo mget *%year%%month%%day%.*>> ftpscript.txt
rem echo get *.*>> ftpscript.txt
echo dir *%year%%month%%day%.*>> ftpscript.txt
rem echo mget *.*>> ftpscript.txt
echo bye >> ftpscript.txt
echo ---=== ftp session begins ===--->> %LOGFILE%
echo ftp %FTPSERVER% to %BACKUPDIR% >> %LOGFILE%
echo mget *%year%%month%%day%.*>>%LOGFILE%

psftp %FTPSERVER% -l %USERNAME% -pw %PASSWORD% -be -b ftpscript.txt >> %LOGFILE%

xcopy s:\upload\*%year%%month%%day%.* S:\uploadbackup /E/C/Q/R/Y
xcopy s:\upload\*.* S:\uploadbackup /E/C/Q/R/Y
if not exist %BACKUPDIR2%\%year%%month%%day% mkdir  %BACKUPDIR2%\%year%%month%%day%
move /Y s:\uploadbackup\*%year%%month%%day%.* %BACKUPDIR2%\%year%%month%%day%
move /Y s:\uploadbackup\*.* %BACKUPDIR2%\%year%%month%%day%

echo ---=== ftp session ends ===--->> %LOGFILE%
echo. |time | findstr "現在時間">> %LOGFILE%
echo %BACKUPDIR2%\%year%%month%%day%>> %LOGFILE%
echo %BACKUPFILE1%>> %LOGFILE%
echo.>> %LOGFILE%
rem del ftpscript.txt
rem del  %LOGFILE%_backup.log
move /Y I:\wSTN_IO\_backup.log  %BACKUPDIR2%\%year%%month%%day%
move /Y I:\wSTN_IO\ftpscript.txt %BACKUPDIR2%\%year%%month%%day%

set TARGET=
set TARGETNAME=
set BACKUPDIR=
set BACKUPFILE=
set LOGFILE=
set FTPSERVER=
set USERNAME=
set PASSWORD=
:end

那關於ftpscript.txt是這樣
open 61.66.19X.XXX 
user S00XX S0XXX 
lcd s:\upload 
cd A0001
mget *20120104.*
cd \
cd A0002
mget *20120104.*
cd \
cd A0003
mget *20120104.*
cd \
cd A0004
mget *20120104.*
cd \
cd A0005
mget *20120104.*
cd \
cd A0006
mget *20120104.*
cd \
cd A0007
mget *20120104.*
cd \
cd A0008
mget *20120104.*
cd \
cd A0009
mget *20120104.*
cd \
cd A0010
mget *20120104.*
cd \
cd A0011
mget *20120104.*
cd \
cd A0012
mget *20120104.*
cd \
cd A0013
mget *20120104.*
cd \
cd A0014
mget *20120104.*
cd \
cd A0015
mget *20120104.*
cd \
cd A0016
mget *20120104.*
cd \
cd A0017
mget *20120104.*
cd \
cd A0018
mget *20120104.*
cd \
cd A0019
mget *20120104.*
cd \
cd A0020
mget *20120104.*
cd \
cd A0021
mget *20120104.*
cd \
cd A0022
mget *20120104.*
cd \
cd A0023
mget *20120104.*
cd \
cd A0024
mget *20120104.*
cd \
cd A0025
mget *20120104.*
cd \
cd A0026
mget *20120104.*
cd \
cd A0027
mget *20120104.*
cd \
cd A0028
mget *20120104.*
cd \
cd A0029
mget *20120104.*
cd \
cd A0030
mget *20120104.*
cd \
cd A0031
mget *20120104.*
cd \
cd A0032
mget *20120104.*
cd \
cd A0033
mget *20120104.*
cd \
cd A0034
mget *20120104.*
cd \
cd A0035
mget *20120104.*
cd \
cd A0036
mget *20120104.*
cd \
cd A0037
mget *20120104.*
cd \
cd A0038
mget *20120104.*
cd \
cd A0039
mget *20120104.*
cd \
cd A0040
mget *20120104.*
cd \
cd A0041
mget *20120104.*
cd \
cd A0042
mget *20120104.*
cd \
cd A0043
mget *20120104.*
cd \
cd A0044
mget *20120104.*
cd \
cd A0045
mget *20120104.*
cd \
cd A0046
mget *20120104.*
cd \
cd A0047
mget *20120104.*
cd \
cd A0048
mget *20120104.*
cd \
cd A0049
mget *20120104.*
cd \
cd A0099
mget *20120104.*
cd \
cd FundX
mget *20120104.*
dir *20120104.*
bye 

有兩個問題
1. 在執行這個.bat檔時,似乎沒辦法執行完畢。
2. 也沒有相關的log記錄。
可是從ftpscript.txt來看,應該是有跑了每一個資料夾。
但是卻沒有將任何資料下載下來。
這是很奇怪的一件事。
再麻煩大大了!
大大您好:
不好意思又打擾了,
有兩個問題
我把.txt檔寫在FTP中。大概如下

echo open %FTPSERVER% > ftpscript.txt
echo user %USERNAME% %PASSWORD% >> ftpscript.txt
echo lcd %BACKUPDIR% >> ftpscript.txt
for /f %%m in  (pbank.txt) do (
echo cd %%m>>ftpscript.txt
rem echo mget *%year%%month%%day%.*>> ftpscript.txt
echo mget *.*>> ftpscript.txt
echo cd \>> ftpscript.txt
 )
echo cd %FTPDIR2%>>ftpscript.txt
echo mget *%year%%month%%day%.*>> ftpscript.txt
rem echo get *.*>> ftpscript.txt
echo dir *%year%%month%%day%.*>> ftpscript.txt
rem echo mget *.*>> ftpscript.txt
echo bye >> ftpscript.txt
echo ---=== ftp session begins ===--->> %LOGFILE%
echo ftp %FTPSERVER% to %BACKUPDIR% >> %LOGFILE%
echo mget *%year%%month%%day%.*>>%LOGFILE%

我的想法是,迴圈再進入該資料夾後,抓取所有的資料完畢,再回上一層,然後再進入下一個資料夾。而log檔案的確是有進入每一個資料夾,但是卻沒有辦法抓取任何的檔案。想請問是否有哪裡有錯誤?
另外一個問題是,可否抓取系統日的資料呢?(因為無法從資料檔名來做區別,所以可否以系統日的資料來抓取?)
不好意思,打擾了。
andowson wrote:我的意思是指如果您想要拜訪(visit)holidays.txt檔案中每一行的資料時,只要寫成下面的 for迴圈即可:
@echo off
for /f  %%i in (holidays.txt) do (
  echo %%i is a holiday 
)

%%i 就是迴圈每前進一圈時,由holidays.txt所讀出的下一筆資料
假設holidays.txt內容如下
2011/1/1
2011/2/2
2011/2/28
2011/4/4
2011/4/5
2011/6/6
2011/9/12
2011/10/10

將會依序印出:
2011/1/1 is a holiday
2011/2/2 is a holiday
2011/2/28 is a holiday
2011/4/4 is a holiday
2011/4/5 is a holiday
2011/6/6 is a holiday
2011/9/12 is a holiday
2011/10/10 is a holiday


不好意思大大:

我還是不太明白,那這個@echo off可以寫在FTP裡面嗎?
因為我寫了一個小批次後,還是不太能夠work...
例如:
@echo off
for /f %%i in (pbank.txt) do(
echo %%i
)
寫了do之後,按了以後,do不能用。
另外%%i可否變成%%m?
真的很抱歉,麻煩您再協助一下!
大大您好:

感謝您的回答,不過因為您寫的那個holiday.bat...我其實看不是很懂,可否請您稍微解釋一下呢?麻煩您了!

大大您好:

不好意思又有問題想請教,因為對DOS的指令實在是很不熟悉。
因為需要在FTP中的各個資料夾中抓取所需的資料,
所以需要A資料夾抓完後,再到上一層資料夾,再至B資料夾。
原本想說可以把要抓的資料夾寫成一個txt檔,就像大大上面寫的holiday.txt一樣。
不過在FTP中,好像不太能用for這個語法。

我的寫法如下:
echo lcd %BACKUPDIR% >> ftpscript.txt
for /f "tokens=1-50 delims= " %%i in (pbank.txt) do(
echo cd %FTPDIR%>>ftpscript.txt
echo mget *%year%%month%%day%.*>> ftpscript.txt
echo cd \>> ftpscript.txt
)
目前FTP好像到這一段就不跑了。

所以可否請看看還有沒有什麼辦法?
感謝!
您好:因為又遇到了點難題,想來請教一下是否有任何可以解決的方法。

目前以cfg的檔案抓取資料都沒有問題,但是目前對方把ftp移至安全環境底下
開啟了相關的port如下:
HTTP安全連線:https-443
FTP安全連線:ftp-21(也有支援安全通道)、ftps-990(也可用此安全通道連線)
FTP被動模式:port-50000~50009
SSL認證:990, 989
SFTP:22
FTP傳輸資料:20

而因為這樣,目前所使用的cfg無法連接上,用一般的FTP軟體也沒有辦法(雖然有提供21port,但似乎是因為沒有安全性,所以被拒絕了)
請問cfg的部分應該怎麼處理呢?謝謝!
謝謝大大,您說的那個cfg我已經試過了,他是會在命令提示字元中出現password的字樣,也就是還是要請我們填入密碼,而若是在cfg中填入'' 或"",則是會出現錯誤訊息(也就是密碼錯誤),後來呢!就只能請對方設定帳號密碼,才能解決這個問題,不過呢!還是很謝謝大大的!

不過,還是有一件事想請問大大,不曉得大大有沒有玩過Windows server 2008呢?在做排定的工作時(排程),沒有辦法順利執行成功(也就是使用7-zip壓縮時,無法順利以排程完成工作),但權限的部份已經設定為最高權限了,不曉得是否還有什麼原因呢?謝謝囉!
您好,不好意思,又有問題想請教。
目前遇到ftp server的密碼為空白
想請問一下cfg檔中的password若為空白時,該如何處理呢?謝謝!
smilie感謝~謝謝您幫我找到這個答案。最後想請問,一般工作日跟放假日,應該都是用比較高階的程式才能寫出來的吧?!Dos能夠寫出這樣的批次檔嗎?也就是說,能夠分辨營業日跟放假日嗎?一般的放假日(ex.六、日)這個部分可以克服(ex.抓取星期幾?),但是,若是遇到其他的假日(ex.中秋節)不是在六日的話,這樣好像就沒辦法了。謝謝!
smilie謝謝你,還蠻實用的,另外,想再請問一下,如何在dos底下,取出星期幾呢?應該是說,如何用date來取出星期?,目前已經研究出N天前的寫法,不過想再問一下是可否知道哪一天是星期幾?謝謝!
smilie謝謝你~這個程式幫助很大。
但是想請教一下,dos的指令,有沒有辦法抓取系統日前一日的日期呢?因為找了很久都找不到任何相關資訊,所以想請教一下,謝謝!
 
討論區首頁 » 個人資料 starzine » 文章發表人是 starzine
前往: