同事問了個問題:他的系統每天會建一個以月份為名的資料夾(如C:\Data\200809、C:\Data\200810等),裡面會放該月每天產生的系統檔案,如何用批次檔把上個月的每個資料夾裡的檔案都刪掉?如果寫支程式(如PowerShell)來做是很簡單,不過卻限制必須使用批次檔來做,這就有點難度了,因為Windows的批次指令實在陽春得可以。
最後測試出來的關鍵解決方法是使用 SET /A,/A 可以做數值運算(arithmetic)。
rem 把日期裡的斜線拿掉;2008/10/21→20081021 set Today=%DATE:/=% rem 取回今天的年度月份;200810 set ThisMonth=%Today:~0,6% rem 本月份減1取得上個月份 set /A LastMonth=%ThisMonth%-1
關鍵點解決了,剩下的就簡單了。
2008/10/23 修訂
有讀者反應若是一月份時程式會有錯,另外一月到九月是一個位數的月份,也要將之補成01~09的兩位數,因而補充以下的修訂版供參考。
@echo off rem 把日期裡的斜線拿掉;2008/10/21→20081021 set Today=%DATE:/=% set ThisYear=%Today:~0,4% rem 取回今天的年度月份;200810 set ThisMonth=%Today:~4,2% if "%ThisMonth%"=="08" set ThisMonth=8 if "%ThisMonth%"=="09" set ThisMonth=9 rem 本月份減1取得上個月份 set /A LastMonth=%ThisMonth%-1 rem 如果是1月份的話,要把年度減1 if "%LastMonth%"=="0" set /A ThisYear=%ThisYear%-1 if "%LastMonth%"=="0" set LastMonth=12 rem 如果是1月到9月時,左補零成為01~09 if "%LastMonth:~1,1%"=="" set LastMonth=0%LastMonth% echo Year=%ThisYear% echo Month=%LastMonth%
2009/06/03 再修訂:
網友反應當月份為08、09時會出現下列錯誤:
不正確的數字。數字常數必須是十進位 (17), 十六進位 (0x11) 或八進位 (021)。
使用 set /? 指令後看到如下說明:
0x 字首在數字前方代表十六進位數字、0b 字 首代表二進位數字或 0 字首代表八進位數字,否則數字值都是指十進位 數字。所以 0x12 就和 18、022 等相同。請注意八進位數字可能容易 弄錯: 像 08 和 09 就不是正確的數字,因為 8 和 9 並不是八進位的 正確數字。
因此08、09被當成八進位的數字了,解決方法似乎只有先把開頭的0去掉後再來運算:
rem 取回今天的年度月份;200810 set ThisMonth=%Today:~4,2% if "%ThisMonth%"=="08" set ThisMonth=8 if "%ThisMonth%"=="09" set ThisMonth=9
##
您可能也會有興趣的類似文章
- [Vista] 設定環境變數SET命令的擴充 (0則留言, 2008/04/19)
- [Windows] 去除環境變數DATE與TIME內的空白 (0則留言, 2008/04/20)
- 替Prompt加上顏色 (0則留言, 2004/12/03)
- 開始使用Cygwin以取代cmd.exe (2則留言, 2007/01/11)
- 安裝通用輸入法編輯器以擴充Windows 7 輸入法 (0則留言, 2011/11/20)
- 萬用影音轉檔程式:FFMpeg與HD專用的VideoConverter (0則留言, 2009/05/10)
- [Windows] 環境變數的擴充功能 (1則留言, 2005/02/23)
- [Windows] 部署相同目錄結構檔案的簡便方法 (0則留言, 2005/03/15)
- DOS命令使用技巧1:最快把文字檔案貼入剪貼簿的方法 (0則留言, 2010/02/27)
- 用App Launcher建立Windows 7的桌面工具列 (0則留言, 2010/11/11)
- 自己當倉頡:打造自己的輸入法 (5則留言, 2005/02/06)
- 新發表的Windows Toodledo client: Due Today (2則留言, 2011/03/13)
- DBDesigner 4: Open source的資料庫建模工具 (2則留言, 2005/02/02)
- 方便切換目錄的指令:PUSHD與POPD (0則留言, 2006/07/15)
- 用wmic建立已安裝軟體清單 (2則留言, 2011/05/16)















這則留言是悄悄話。
請問!那如果是200801的時候要取得200712要怎麼辦呢?
因為01減一會變成00而非12
簡睿,
你在 2008/10/23 修訂的程式中好像有一行是錯的:
if “%LastMonth%”==”0″ set LastMonth=01
如果 LastMonth 等於 0 的話,應該被指定為 12 才對吧?
咦,真的寫錯了,感謝訂正。
您好:我也是要做定期清除備份檔,這篇文章剛好解決了我的問題,十分有用,謝謝你囉.
不必客氣 :-)
拜讀您的blog真是增長知識!
歡迎常來參觀。
拜讀您的文章後,有個小問題,不知是否可教一下
@echo off
set ThisMonth=08
set /A LastMonth=%ThisMonth%-1
echo LastMonth=%LastMonth%
pause
==>當 set ThisMonth 這個值,設定 01~07、10~12,則運算正常
若,設為08、09這二個,則出現下列的錯誤訊息
不正確的數字。數字常數必須是十進位 (17),
十六進位 (0×11) 或八進位 (021)。
請您幫個忙,解惑一下,謝謝!!
請看本文 2009/06/03 再修訂 這段。
感謝回報錯誤。