練功房推薦書單

  • 下班後賺更多:記帳、存錢、再投資,富朋友的「破窮理財法」提早20年退休不是夢!
  • 拯救3C惡視力:別讓眼睛過勞死,低頭族必備的視力保健書
  • 東京地鐵遊2014年最新版
  • 打造HTML5+CSS3網頁設計法則:jQuery行動加碼(第二版)
[Windows]如何定時自動備份整個網站目錄到遠端伺服器  XML
Forum Index » Windows Server
Author Message
andowson

六段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 679
Location: 台北
Offline

smilie設計理念
1.先將要備份的目錄壓縮起來(節省傳輸時間)
2.然後再ftp到遠端的伺服器去(建立日期目錄)
3.定時自動執行(如每日凌晨三點)

首先,3可用Windows附屬應用程式=>系統工具=>排定的工作來完成,我們最後設定即可。
1和2則需要寫支DOS batch程式來完成,假設叫做remote_backup_web.bat。底下是該bat檔案的內容
rem ---------------------------------------------------------------------------
rem Backup web application to remote host
rem
rem $Id: remote_backup_web.bat 2007-02-07 21:24:43Z andowson $
rem ---------------------------------------------------------------------------

@echo off
rem Find out web server's IP address
ipconfig | findstr "Address" > ip1.txt
for /f "tokens=1-2 delims=:" %%i in (ip1.txt) do echo %%j > ip2.txt
for /f "tokens=1-2 delims= " %%i in (ip2.txt) do (set ip=%%i)
del ip1.txt
del ip2.txt

rem Get today's year, month, day
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set year=%%a& set month=%%b& set day=%%c)

rem Modify the following line for your environment
set TARGET=C:\Inetpub\wwwroot\demoweb
set TARGETNAME=demoweb
set BACKUPDIR=D:\backup
set BACKUPFILE=%BACKUPDIR%\%year%\%TARGETNAME%_%ip%_%year%%month%%day%.zip
set LOGFILE=%TARGETNAME%_backup.log

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

rem Compress the target directory before ftp
zip -r %BACKUPFILE% %TARGET%\*

if not exist %BACKUPDIR%\%year% mkdir %BACKUPDIR%\%year%

if not exist %BACKUPFILE% goto nofile
goto ftpsession

:nofile
echo [FAILURE] can't find %BACKUPFILE% >> %LOGFILE%
echo.>> %LOGFILE%
goto end

: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 mkdir %year%%month%%day% >> ftpscript.txt
echo cd %year%%month%%day% >> ftpscript.txt
echo bi >> ftpscript.txt
echo put %BACKUPFILE% >> ftpscript.txt
echo bye >> ftpscript.txt

echo ---=== ftp session begins ===--->> %LOGFILE%
echo ftp %BACKUPFILE% to %FTPSERVER% >> %LOGFILE%

ftp -i -n < ftpscript.txt >> %LOGFILE%

echo ---=== ftp session ends ===--->> %LOGFILE%
echo. |time | findstr "現在時間">> %LOGFILE%
echo.>> %LOGFILE%

del ftpscript.txt

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

:end


其中zip指令(取自Info-ZIP發行之免費軟體)並非Windows內建的指令,請由本站下載,放到C:\Windows目錄下

Windows內建的FTP指令說明可以透過執行ftp --usage指令得到:
ftp --usage

Transfers files to and from a computer running an FTP server service
(sometimes called a daemon). Ftp can be used interactively.

FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-w:windowsize] [-A] [host]

  -v             Suppresses display of remote server responses.
  -n             Suppresses auto-login upon initial connection.
  -i             Turns off interactive prompting during multiple file
                 transfers.
  -d             Enables debugging.
  -g             Disables filename globbing (see GLOB command).
  -s:filename    Specifies a text file containing FTP commands; the
                 commands will automatically run after FTP starts.
  -a             Use any local interface when binding data connection.
  -A             login as anonymous.
  -w:buffersize  Overrides the default transfer buffer size of 4096.
  host           Specifies the host name or IP address of the remote
                 host to connect to.

Notes:
  - mget and mput commands take y/n/q for yes/no/quit.
  - Use Control-C to abort commands.


另外我把ftp的參數檔存放在ftp.cfg,內容如下
remotehost username password

remotehost:請改成您的遠端主機IP(需有啟動FTP Server)
username:請改成您的FTP帳號
password:請改成您的FTP密碼

執行完會在執行目錄下產生一個logfile,可供debug用。

最後,遠端伺服器需先建立好對應的帳號及密碼,如有修改請記得回來改ftp.cfg

參考資料:
易學易用的 Windows PowerShell
 Filename zip.exe [Disk] Download
 Description zip.exe (v2.32)
 Filesize 132 Kbytes
 Downloaded:  204 time(s)

 Filename ftp.cfg [Disk] Download
 Description ftp.cfg
 Filesize 28 bytes
 Downloaded:  210 time(s)

 Filename remote_backup_web.bat [Disk] Download
 Description remote_backup_web.bat
 Filesize 2 Kbytes
 Downloaded:  238 time(s)

This message was edited 15 times. Last update was at 2011-10-07 21:23:40

收進你的MyShare個人書籤 plurk twitter 分享

分享經驗 累積智慧
[WWW] [MSN]
winglee007

十級學員

Joined: 2008-11-21 12:46:48
Messages: 1
Offline

首先謝謝你,我用了這個bat,超好用的^^

但有一個問題想問一下,如果我在壓縮的時候,可以有方法在這bat檔加上密碼才上傳到ftp嗎?

因為我們要處理會計的文件,很機密的,謝謝

收進你的MyShare個人書籤 plurk twitter 分享
andowson

六段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 679
Location: 台北
Offline

要加上密碼也是可以的,只要將原本的zip.exe換一個可以加密碼的壓縮軟體執行檔即可,例如7-Zip這個免費又可以加上密碼的壓縮軟體的7z.exe。
1.到http://www.7-zip.org/下載安裝用的exe檔
2.執行下載的exe檔安裝
3.安裝完成後,將C:\Program Files\7-Zip下的7z.exe複製到C:\Windows\System32目錄下。

相關的參數可以在命令列下執行7z獲得:
7-Zip 4.57  Copyright (c) 1999-2007 Igor Pavlov  2007-12-06

Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]
       [<@listfiles...>]

<Commands>
  a: Add files to archive
  b: Benchmark
  d: Delete files from archive
  e: Extract files from archive (without using directory names)
  l: List contents of archive
  t: Test integrity of archive
  u: Update files to archive
  x: eXtract files with full paths
<Switches>
  -ai[r[-|0]]{@listfile|!wildcard}: Include archives
  -ax[r[-|0]]{@listfile|!wildcard}: eXclude archives
  -bd: Disable percentage indicator
  -i[r[-|0]]{@listfile|!wildcard}: Include filenames
  -m{Parameters}: set compression Method
  -o{Directory}: set Output directory
  -p{Password}: set Password
  -r[-|0]: Recurse subdirectories
  -scs{UTF-8 | WIN | DOS}: set charset for list files
  -sfx[{name}]: Create SFX archive
  -si[{name}]: read data from stdin
  -slt: show technical information for l (List) command
  -so: write data to stdout
  -ssc[-]: set sensitive case mode
  -ssw: compress shared files
  -t{Type}: Set type of archive
  -v{Size}[b|k|m|g]: Create volumes
  -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: Update options
  -w[{path}]: assign Work directory. Empty path means a temporary directory
  -x[r[-|0]]]{@listfile|!wildcard}: eXclude filenames
  -y: assume Yes on all queries


以下是一個執行命令的範例,會將目前整個目錄壓縮起來存到c:\backup.zip檔案,並加上密碼secret。
7z a -psecret c:\backup.zip *


所以原來程式簡易的修改方式如下:
將第29行的程式碼取代為:
set ZIPPASSWORD=secret
7z a -p%ZIPPASSWORD% %BACKUPFILE% %TARGET%\*  

This message was edited 2 times. Last update was at 2009-10-11 01:10:33

收進你的MyShare個人書籤 plurk twitter 分享

分享經驗 累積智慧
[WWW] [MSN]
starzine

九級學員

Joined: 2009-09-29 15:04:31
Messages: 14
Offline

smilie謝謝你~這個程式幫助很大。
但是想請教一下,dos的指令,有沒有辦法抓取系統日前一日的日期呢?因為找了很久都找不到任何相關資訊,所以想請教一下,謝謝!

This message was edited 1 time. Last update was at 2009-11-18 10:41:36

收進你的MyShare個人書籤 plurk twitter 分享
andowson

六段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 679
Location: 台北
Offline

底下是我在網路上蒐尋DOS batch 取得前一天的日期得到的資料,供您參考
@echo off
:: 作者: namejm  出自:cn-dos
:: 求N天前的日期
:: 日期可以帶星期,但是,必須以年月日的順序排列
:: 年份必須是四位,否則會出錯
@echo off
:Main
cls
set day=%date%
set days=0
echo.&echo.
echo       當前日期是:%day%
echo.&set /p input=      請指定要追溯的天數:
setlocal enabledelayedexpansion
:: 提取日期
for /f "tokens=1-3 delims=-/. " %%i in ("%day%") do (
    set /a sy=%%i, sm=100%%j %% 100, sd=100%%k %% 100
)
set /a sd-=input
if %sd% leq 0 call :count
cls&echo.&echo.
echo       當前日期是:%day%
echo.
set sm=0%sm%
set sd=0%sd%
echo       %input% 天前的日期是:%sy%-%sm:~-2%-%sd:~-2%
pause>nul
goto Main

:count
set /a sm-=1
if !sm! equ 0 set /a sm=12, sy-=1
call :days
set /a sd+=days
if %sd% leq 0 goto count
goto :eof

:days
:: 獲取指定月份的總天數
set /a leap="^!(sy %% 4) & ^!(^!(sy %% 100)) | ^!(sy %% 400)"
set /a max=28+leap
for /f "tokens=%sm%" %%i in ("31 %max% 31 30 31 30 31 31 30 31 30 31") do set days=%%i
goto :eof
 Filename prevdays.bat [Disk] Download
 Description 取得系統日期前N天的日期
 Filesize 988 bytes
 Downloaded:  56 time(s)

This message was edited 3 times. Last update was at 2011-10-20 22:37:24

收進你的MyShare個人書籤 plurk twitter 分享

分享經驗 累積智慧
[WWW] [MSN]
starzine

九級學員

Joined: 2009-09-29 15:04:31
Messages: 14
Offline

smilie謝謝你,還蠻實用的,另外,想再請問一下,如何在dos底下,取出星期幾呢?應該是說,如何用date來取出星期?,目前已經研究出N天前的寫法,不過想再問一下是可否知道哪一天是星期幾?謝謝!

This message was edited 1 time. Last update was at 2009-11-18 10:39:19

收進你的MyShare個人書籤 plurk twitter 分享
andowson

六段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 679
Location: 台北
Offline

可以用下面的DOS指令取出目前的系統日期是星期幾
echo %date:~-3%
如果是要找出前N天是星期幾的話,可以先將系統日期暫存,然後改為前N天的日期,呼叫上面的指令即可取得星期幾,然後再將系統日期改回去。
@echo off
set prevday=2009/10/04
set today=%date:~0,10%  
date %prevday%  
echo %date:~-3%  
date %today%

參考資料:
http://www.cnblogs.com/ustcyier/archive/2008/04/14/1152303.html

This message was edited 2 times. Last update was at 2009-10-11 01:13:14

收進你的MyShare個人書籤 plurk twitter 分享

分享經驗 累積智慧
[WWW] [MSN]
starzine

九級學員

Joined: 2009-09-29 15:04:31
Messages: 14
Offline

smilie感謝~謝謝您幫我找到這個答案。最後想請問,一般工作日跟放假日,應該都是用比較高階的程式才能寫出來的吧?!Dos能夠寫出這樣的批次檔嗎?也就是說,能夠分辨營業日跟放假日嗎?一般的放假日(ex.六、日)這個部分可以克服(ex.抓取星期幾?),但是,若是遇到其他的假日(ex.中秋節)不是在六日的話,這樣好像就沒辦法了。謝謝!

This message was edited 2 times. Last update was at 2009-11-18 10:42:06

收進你的MyShare個人書籤 plurk twitter 分享
andowson

六段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 679
Location: 台北
Offline

我想山不轉路轉吧,可以用這樣的方式來達成,
1.手動建立一個假日檔,例如檔名取叫holidays.txt,每行一個日期,樣子如下:
2009/10/03
2009/12/25

2.從假日檔中每次讀取一行跟前N天的日期作比對,如果相同表示該前N天的日期即為假日,輸出 is a holiday的訊息

底下是範例的程式碼:
@echo off
set prevday=2009/10/03
set isHoliday=0
for /f  %%i in (holidays.txt) do call :checkHoliday %prevday% %%i
if %isHoliday%==1 (
  echo %prevday% is a holiday 
)
goto :end

:checkHoliday
if %1==%2 (  
  set isHoliday=1
)

:end
 Filename holidays.txt [Disk] Download
 Description 假日資料檔
 Filesize 22 bytes
 Downloaded:  33 time(s)

 Filename holiday.bat [Disk] Download
 Description 檢查某個日期是否為假日
 Filesize 246 bytes
 Downloaded:  35 time(s)

This message was edited 4 times. Last update was at 2009-10-11 01:13:56

收進你的MyShare個人書籤 plurk twitter 分享

分享經驗 累積智慧
[WWW] [MSN]
starzine

九級學員

Joined: 2009-09-29 15:04:31
Messages: 14
Offline

您好,不好意思,又有問題想請教。
目前遇到ftp server的密碼為空白
想請問一下cfg檔中的password若為空白時,該如何處理呢?謝謝!
收進你的MyShare個人書籤 plurk twitter 分享
andowson

六段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 679
Location: 台北
Offline

據我所知,除非您是使用TFTP(Trivial File Transfer Protocol) Server,才不需要驗證,否則
不用密碼就可以登入FTP Server smilie好像不太可能(至少違反安全性,應該很難持續這種狀態),就算是匿名(Anonymous) FTP也是要輸入一下e-mail當作密碼的。

如果您的系統真的不用輸入密碼,可以試試看將ftp.cfg編輯成類似下列的樣子,試試看有什麼錯誤訊息再回報吧:
remotehost username 


參考文件:
http://www.sinica.edu.tw/ccc/sysinfo/desktop/ftp.pdf
http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol
收進你的MyShare個人書籤 plurk twitter 分享

分享經驗 累積智慧
[WWW] [MSN]
starzine

九級學員

Joined: 2009-09-29 15:04:31
Messages: 14
Offline

謝謝大大,您說的那個cfg我已經試過了,他是會在命令提示字元中出現password的字樣,也就是還是要請我們填入密碼,而若是在cfg中填入'' 或"",則是會出現錯誤訊息(也就是密碼錯誤),後來呢!就只能請對方設定帳號密碼,才能解決這個問題,不過呢!還是很謝謝大大的!

不過,還是有一件事想請問大大,不曉得大大有沒有玩過Windows server 2008呢?在做排定的工作時(排程),沒有辦法順利執行成功(也就是使用7-zip壓縮時,無法順利以排程完成工作),但權限的部份已經設定為最高權限了,不曉得是否還有什麼原因呢?謝謝囉!
收進你的MyShare個人書籤 plurk twitter 分享
n5998744

十級學員

Joined: 2011-01-26 01:31:43
Messages: 1
Offline

您好,想請教老師:
如果我只想把備份的檔案放到同一台電腦的其他槽區而已,那應該要改哪裡?
再請問老師,資料庫的資料可以如何自動備份 ?
非常感謝!!
收進你的MyShare個人書籤 plurk twitter 分享
andowson

六段學員
[Avatar]

Joined: 2007-01-02 22:20:40
Messages: 679
Location: 台北
Offline

n5998744您好:
如果只要把備份的檔案放到同一台電腦的其他槽區而已=>就是不作FTP的動作囉?
那就把ftpsession那段跳過去即可,可以修改remote_backup_web.bat的第34行
	goto ftpsession


	goto end

如果要更改備份檔所在的目錄,可以修改第21行
	set BACKUPDIR=D:\backup


不知道您是使用何種資料庫軟體,如果是使用MS SQL Server,要備份資料庫到本機硬碟的話就很簡單,可以在資料庫軟體上設定排程,將資料庫備份到某一個目錄下即可。

This message was edited 1 time. Last update was at 2011-01-28 17:25:52

收進你的MyShare個人書籤 plurk twitter 分享

分享經驗 累積智慧
[WWW] [MSN]
starzine

九級學員

Joined: 2009-09-29 15:04:31
Messages: 14
Offline

您好:因為又遇到了點難題,想來請教一下是否有任何可以解決的方法。

目前以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的部分應該怎麼處理呢?謝謝!
收進你的MyShare個人書籤 plurk twitter 分享
 
Forum Index » Windows Server
Go to: