iT邦幫忙

37

在Windows裡擷取前一天日期的指令碼

jhwang 2008-05-08 16:45:2039910 瀏覽

昨天我想要把每個月的資料壓縮並備份起來,突然覺得如果可以自動執行該有多好?但是我想要備份前一天的資料,或每個月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%直接叫出年月日,總之就是自行視狀況彈性修改囉~


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
john651216
iT邦研究生 1 級 ‧ 2008-05-08 17:23:42

謝謝分享

0
tgunlu
iT邦研究生 1 級 ‧ 2008-05-08 17:46:23

謝謝分享

0
davistai
iT邦大師 1 級 ‧ 2008-05-08 19:07:20

很好,感謝!!

0
emisjerry
iT邦新手 4 級 ‧ 2008-05-08 20:45:07

提供另一個簡單的方法:用環境變數的子字串功能即可。
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

0
funkent
iT邦高手 1 級 ‧ 2008-05-08 20:49:07

感謝分享

0
fanylu60
iT邦研究生 1 級 ‧ 2008-05-08 22:34:20

謝謝分享

0
jennymsn
iT邦好手 10 級 ‧ 2008-05-08 22:53:12

謝謝分享

0
mmm12345
iT邦研究生 1 級 ‧ 2008-05-08 23:13:53

謝謝分享

0
jjw
iT邦研究生 1 級 ‧ 2008-05-08 23:55:01

謝謝分享

0
plutosrita
iT邦研究生 1 級 ‧ 2008-05-09 08:29:01

謝謝分享

0
cutters
iT邦新手 4 級 ‧ 2008-05-09 08:44:20

謝謝分享

0
kaiin323
iT邦高手 1 級 ‧ 2008-05-09 10:03:19

雖然我不常寫code,但看看還是有用的^^
Thx

0
ping
iT邦研究生 1 級 ‧ 2008-05-09 16:43:08

謝謝分享

0
yce701116
iT邦研究生 1 級 ‧ 2008-05-09 22:48:31

謝謝分享

0
hcf
iT邦新手 4 級 ‧ 2008-05-11 04:18:19

謝謝分享

0
loripan
iT邦研究生 1 級 ‧ 2008-05-11 22:08:38

謝謝分享

0
jjw
iT邦研究生 1 級 ‧ 2008-05-12 23:49:45

謝謝分享

0
jcck20008
iT邦研究生 1 級 ‧ 2008-05-15 06:18:38

code rules !!

0
tyc1220
iT邦研究生 1 級 ‧ 2008-05-29 01:28:52

謝謝分享

0
Jeter
iT邦新手 5 級 ‧ 2008-11-14 08:18:40

謝謝分享

0
scchen98
iT邦新手 5 級 ‧ 2015-06-15 09:47:23

請問一下,年月日中間會出現空格要怎麼處理?
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%
echo %y%%m%%d%

年月日要怎麼補零(月日不滿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%

0
girukimo
iT邦新手 4 級 ‧ 2018-01-10 09:38:47

請問各位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%

1
girukimo
iT邦新手 4 級 ‧ 2018-01-10 11:30:56

再測,已查出原因,解決了。
是這行if %d% LSS 9 set d=0%d% 才對,剛修改錯到月份的部份。
將9改為10就解決了。謝謝。

Can iT邦新手 5 級 ‧ 2023-09-28 12:36:30 檢舉

對呀,剛剛在修正以前的bat檔的時候,
也發現如果只用LSS 9只會在1~8月補0,
要設定在LSS 10 才會出現我們想要的結果,
在1~9都會補0。

我要留言

立即登入留言