2005年02月23日
[Windows] 環境變數的擴充功能
(注意:文中的百分號在存入時會造成其後文字都被截斷,因此改成全形的,實際使用時必須是半形才對)
##
問題:用Windows的排程在每天半夜自動備份檔案,備份檔名要帶當日月份與日期, 例如:backup_0223.zip(前提是要完全用批次檔處理,不然自己寫程式當然就解決了)。
解法:
- 系統日期在DOS下可以用%DATE%環境變數取得
- 用類似 7z.exe a backup_%DATE%.zip d:\dir1 的方式就完成了
- 結果並不像想的那麼單純。%DATE%傳回的是類似"2005/02/23 星期三"這樣的文字, 其內的斜線(/)或減號(-)都是用做命令列的選項符號,這樣的組合可能會造成錯誤。
- 在此最簡單的方法便是用環境變數的擴充功能了:backup_%DATE:~5,2%.zip→取環境 變數DATE的值,由第六碼開始取兩碼(由0開始算,第六碼要用5), 組合後的檔名是backup_02.zip。
- 繼續取日期:backup_%DATE:~5,2%%DATE:~8,2%.zip→ 結果為backup_0223.zip
- 先用echo命令測試:echo backup_%DATE:~5,2%%DATE:~8,2%.zip
- 以上取子字串的位置會依控制台"地區及語言選項"內的日期格式設定而有不同
- Windows 2000與XP不清楚是否已有此擴充
環境變數取代功能已經有下列增強:
%PATH:str1=str2%
會將 PATH 環境變數展開,取代每個發現的 "str1" 與 "str2"的擴充結果。
"str2" 可以是空白字串,這會從擴充輸出中刪除全部 "str1"。"str1" 可以
用星號開始,這將會從擴充輸出的開頭開始,對應到從所有第一個發現含有
str1 的項目。
您也可以為擴充功能指定子字串。
%PATH:~10,5%
這將會擴充 PATH 環境變數,然後只使用擴充結果的第 11 個(位移 10)字元
後的 5 個字元如果長度未指定,將會預設為上次使用的變數值。如果數字(位
移或長度)是負數,使用的數字將會是環境變數的長度加上位移或指定長度。
%PATH:~-10%
將抽出 PATH 變數的最後 10 個字元。
%PATH:~0,-2%
將抽出 PATH 變數的最後 2 個字元。
最後,系統加入了延遲環境變數展開的支援。在預設狀態下,命令展開會啟
用這項支援,但是您可以在 CMD.EXE 用 /V 命令列參數來啟用/停用這個功
能。 請參看 CMD /?
##
引用URL
http://cgi.blog.roodo.com/trackback/23407
回應文章 
假設現在有windows版的grep及wc可以執行
要計算檔案 love.txt 出現幾次 Andy ,如果超過500次顯示"love over 500"
在UNIX ksh下:
val=`grep Andy love.txt|wc -l`
if $val gt 500
then
echo love over 500
fi
可以完成,但windows下無法把執行結果直接帶入變數....
變通方法如下:
for /F "usebackq" %i in (`"grep Andy love.txt|wc -l"`) do set val=%i
if %val% gtr 500 echo love over 500
也可以達到相同目的....
研究了好久才試出如何在windows下導出執行結果,經驗交流一下
要計算檔案 love.txt 出現幾次 Andy ,如果超過500次顯示"love over 500"
在UNIX ksh下:
val=`grep Andy love.txt|wc -l`
if $val gt 500
then
echo love over 500
fi
可以完成,但windows下無法把執行結果直接帶入變數....
變通方法如下:
for /F "usebackq" %i in (`"grep Andy love.txt|wc -l"`) do set val=%i
if %val% gtr 500 echo love over 500
也可以達到相同目的....
研究了好久才試出如何在windows下導出執行結果,經驗交流一下
Posted by HYP
at 2005年07月14日 19:44
謝謝簡睿兄的
%DATE%環境變數使用技巧,
剛好解決我現在寫bat檔,去備份檔案的問題.
這年頭, 會用 dos 指令的人已經很少了,
沒想到簡睿兄還會這麼高級深入的環境變數使用技巧.
謝謝了
%DATE%環境變數使用技巧,
剛好解決我現在寫bat檔,去備份檔案的問題.
這年頭, 會用 dos 指令的人已經很少了,
沒想到簡睿兄還會這麼高級深入的環境變數使用技巧.
謝謝了
Posted by 阿樹
at 2007年11月6日 23:35
很高興有幫上忙。:)
Posted by emisjerry
at 2007年11月7日 21:50

很榮幸能看到簡睿兄的教學,
我將之應用於製作GHO備份的自動檔名,如:080610.gho ......
但請問,在此情形下如何尋回最新日期的備份檔名,
進行最新備份檔案的復原工作,(如反序搜尋檔案),
或者更精細一點,列出檔名任人自由選擇欲採用的復
原檔案?
敬請指教!不吝感激。
Posted by Jacky
at 2008年06月15日 21:48

真是太感激你了!剛好救了我的危機
Posted by Arvin
at 2008年06月25日 17:36
