Monday, September 14, 2015

BAT檔案的幾個小技巧

好久没有使用BAT檔寫程式了,  最近為了自動備存偵測器機器上的記錄資料, 翻找了一些BAT檔案的程式資料, 順便記錄一下免得以後忘了 \
(XP下跑OK, 其他平台格式等可能要試試看是否不同)



1  日期時間的操作
rem 取得目前時間及日期
rem 若小時 為0~9, 時間位數仍為2位,
rem 但因前置空位不會自動補0, 在10:00以前會成為 " 1"," 2".." 9"
rem 在10:00以前會造成2種錯誤:  1st 被誤判為8進位, 2nd第1字元"0"不可見,
rem 此類錯誤在10:00以後不會發生, 常造成測試時間不同時, 測試結果的不同
rem PS 時間顯示格式, 可能會因作業系統不同而不同, 需配合修改
rem ps 另需注意 12/24小時制也有可能有差異

rem 取得目前系統時間 如 14:17:55.23, 並於 前置位置為空時補上"0"
set NOWT=%TIME: =0%
rem 取得目前系統日期 如  2015/09/14 星期一
set NOWD=%DATE%

rem
rem 為分別取出 月份 mm及分mm,改為mmd:月mmt:分 dd:日期  yy:年 ww:星期 hh:時 ss:秒
rem DOS prompt 中字串前帶0, 會被視為8進位數字07以下set /a動作正常, 但08及09 需特別處理
rem 參考網路資料, 可將具有前置0的常數, 重新處理為不帶0的常數
rem 字串第一個位址, index=0
rem set 使用注意: 後綴的空白字元亦會出現在常數, 打字時需特別注意,
rem 已設定的常數在同一個 DOS session 中持續有效, 重開DOS session 後會清除

rem 依                           時     分         秒    年    月         日    星期 取出
rem 分別設定給 常數 : hh0   mmt0   ss0  yy0  mmd0   dd0  ww0
rem 自字串第0位開始取2位(0,1)作為時間的"時"值, 第2位為時間分割符號":"
set hh0=%NOWT:~0,2%
rem 自字串第3位開始取2位(3,4)作為時間的"分"值, 第5位為時間分割符號":"
set mmt0=%NOWT:~3,2%
rem 自字串第6位開始取2位(6,7)作為時間的"秒"值
set ss0=%NOWT:~6,2%
rem 自字串第0位開始取4位作為"年份"值
set yy0=%NOWD:~0,4%
rem 自字串第5位開始取2位作為"月份"值
set mmd0=%NOWD:~5,2%
rem 自字串第8位開始取2位作為"日"值
set dd0=%NOWD:~8,2%
rem 自字串第11位開始取3位作為"星期"值
set ww0=%NOWD:~11,3%

rem 參考網路資料, 可將具有前置0的常數, 重新處理為不帶0的常數
rem 並指定給 hh,mmt,ss,yy,mmd,dd
if %hh0:~0,1%  == 0  (SET /A  hh=%hh0:~1,1%+0)   else (set /a hh=%hh0%+0)
if %mmt0:~0,1%  == 0 (SET /A  mmt=%mmt0:~1,1%+0) else (set /a mmt=%mmt0%+0)
if %ss0:~0,1%  == 0  (SET /A  ss=%ss0:~1,1%+0)   else (set /a ss=%ss0%+0)
rem yy > 2015 不需額外處理
set yy=%yy0%
if %mmd0:~0,1%  == 0 (SET /A  mmd=%mmd0:~1,1%+0) else (set /a mmd=%mmd0%+0)
if %dd0:~0,1%  == 0  (SET /A  dd=%dd0:~1,1%+0)   else (set /a dd=%dd0%+0)
rem ww <7 p="">set ww=%ww0%

2 常數的加減乘除

rem SET /A 可對常數進行運算,
rem 特別注意DOS prompt 中字串前帶0, 會被視為8進位數字07以下set /a動作正常, 08及09 需特別處理, 10以後會即會以10進位處理

rem 計算前1日日期並設為 dda(數字) ,
rem dda補0後設為dds(字串)取最後兩位產生兩位數的前一日日期字串

set /a dda=%dd%-1
rem 設定日期前補 "0"   1=> 01 ,  2=>02 , 3=>03 ....10=>010, 11=>011, 用以產生檔名字串
set dds=0%dda%
rem %dds:~-2% 取日期字串最後2位  01=01    011=11 取得前一日之記錄檔檔名
set LOG_FILE=%yy%-%mmd%-%dds:~-2%.txt

3 列舉路徑中的檔案 for %i in (*) do (command)
引用參數要再前置 %
FOR %%i in (*.txt) do copy %%i old_data2



No comments: