昨天我想要把每個月的資料壓縮並備份起來,突然覺得如果可以自動執行該有多好?但是我想要備份前一天的資料,或每個月1號備份上個月的資料,就想說要怎麼辦?
因為我不會寫程式,我同事就幫我找網路上的語法來修改完成,我覺得滿實用的,在此獻醜分享給大家~(作業平台是Windows 2003)
把以下程式碼 copy 到一個.bat檔裡:
echo wscript.echo dateadd("d",-1,date) >%tmp%\tmp.vbs
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k
if %m% LSS 9 set m=0%m%
if %d% LSS 9 set d=0%d%
然後 %y%、%m%、%d% 就可以分別呼叫出一天前的年、月、日了
第一行的 dateadd("d",-1,date) 的 -1 如果改成 -2,就是二天前,依此類推
舉例來說,如果想要 copy 檔案到其它地方放,就可以在 .bat 檔接著寫:
copy c:\log\*.log d:\log\%y%\%y%%m%\%y%%m%%d%\
然後排程每天凌晨 00:01 分執行這個.bat檔,假設 2008年5月8號00:01 執行的話
就會把 *.log 檔都 copy 到d:\log\2008\200805\20080507\下面
當然,也可以用 move 的,或是要先壓縮再備份,都可以自行運用
若第一行的 dateadd("d",-1,date) 改成 dateadd("m",-1,date),則取一個月前的日期
改成 dateadd("m",-2,date),則是取二個月前
所以我都拿來改成自動刪除半年前的資料,一樣可以自行運用
不過我記得好像哪個版本的 Windows,因為 date 的格式不一樣,所以 tokens 那裡要改
(可能是把 1,2,3 改成 2,3,4),所以設定之前記得測試一下喔
當然這是窮人版的做法,網路上可能有一大堆的備份軟體都可以做到
因為我個人不喜歡在系統上灌有的沒的,用愈簡單的方式來做,可能問題會愈少一點
補充說明,如果只要擷取當天的日期,語法就更精簡,第一行和最後二行都不需要,如:
for /f "tokens=1,2,3 delims=/- " %%i in ("%date%") do set y=%%i
for /f "tokens=1,2,3 delims=/- " %%i in ("%date%") do set m=%%j
for /f "tokens=1,2,3 delims=/- " %%i in ("%date%") do set d=%%k
其實只要看懂上面程式碼在幹嘛,還可以改的更精簡:
for /f "tokens=1,2,3 delims=/- " %%i in ("%date%") do set dd=%%i%%j%%k
這樣用%dd%直接叫出年月日,總之就是自行視狀況彈性修改囉~
提供另一個簡單的方法:用環境變數的子字串功能即可。
set DATE0=%DATE:/=-%
set DATE0=%DATE: =0%
set TIME0=%TIME: =0%
set DATE1=%DATE0:~5,2%%DATE0:~8,2%
set TIME1=%TIME0:~0,2%%TIME0:~3,2%
echo 日期=%DATE1%, 時間=%TIME1%
2008/5/8日 第一行先把斜線換成減號,以避免斜線變成選項的斜線
早上10點以前的時間會是空9的格式,因此後兩行把空白換成0
最後兩行取子字串的月和日,時與分
請參考:http://blog.xuite.net/emisjerry/tech/16772599
年月日要怎麼補零(月日不滿10的時候)
echo wscript.echo dateadd("d",-1,date) >%tmp%\tmp.vbs
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set dd=%%i%%j%%k
echo %dd%
請問各位code前輩,使用上我遇到了一個問題
就是當日期遇到10號這個日子時,所取得的日期卻變成2018019(日子少了一個0)
測試其他日期都還蠻正常的,年初/月底/月初的日期都能正常取得到yyyymmdd
有修改過下列這行的數字為10與11,但取的日期還是yyyymmd ,少了個0
if %m% LSS 9 set m=0%m%
程式引用來源
echo wscript.echo dateadd("d",-1,date) >%tmp%\tmp.vbs
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set y=%%i
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set m=%%j
for /f "tokens=1,2,3 delims=/- " %%i in ('cscript /nologo %tmp%\tmp.vbs') do set d=%%k
if %m% LSS 9 set m=0%m%
if %d% LSS 9 set d=0%d%
再測,已查出原因,解決了。
是這行if %d% LSS 9 set d=0%d% 才對,剛修改錯到月份的部份。
將9改為10就解決了。謝謝。
對呀,剛剛在修正以前的bat檔的時候,
也發現如果只用LSS 9只會在1~8月補0,
要設定在LSS 10 才會出現我們想要的結果,
在1~9都會補0。