最近公司的項目,需要部署一個oracle定時備份腳本,刪除掉特定時間前的備份文件。BAT批處理文件結合windows系統(任務計划程序)
正常情況下我們的任務計划會有反饋數值,通過它可以判斷這個任務計划上次是否運行正常。
- 代碼 0 或 0x0:操作成功完成。
- 代碼 1 或 0x1:調用的函數不正確或調用了未知函數。
- 代碼 10 或 0xa:環境不正確。
- 代碼 0x8009000f:常規訪問被拒絕
任務計划程--歷史記錄里,操作完成,任務完成。但是在任務欄--上次運行結果顯示不是操作成功完成(0x0),而是0x1。
通過以上錯誤代碼,去排除調用的函數,發現是腳本文件里的定義時間機制,與設定任務計划時間不匹配造成無法正確運行腳本。
我在任務計划設置的時間是 AM 0:30
bat腳本時間設定如下:
set var=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
導致腳本無法正常運行的語句如下:
%time:~0,2%%time:~3,2%%time:~6,2%
如下的各個操作的意義如下:
%time:~0,2% 表示從左向右指針向右偏0位,然后從指針偏移到的位置開始提取2位字符,結果是小時字段數值
%time:~3,2% 表示指針從左向右偏移3位,然后從偏移處開始提取2位字符,結果是分鍾字段數值
%time:~6,2% 表示指針從左向右偏移6位,然后從偏移處開始提取2位字符,結果是秒字段數值
//創建時間命名的文件夾
md d:\%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
用%time:~0,2%%time:~3,2%%time:~6,2%時有個問題, 就是如果TIME 是00點的時候,電腦顯示的是0 不是00所以%time:~0,2%就報錯了。
例子:2019-1-20時間1:26:20
set fileDate=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
set fileDate2=%date:~0,4%%date:~5,2%%date:~8,2%%time:~1,1%%time:~3,2%%time:~6,2%
echo fileDate:%fileDate%
echo fileDate2:%fileDate2%
fileDate: 20190120 12620(1前面是空格)
fileDate2: 2019012012620
總結:
1)如果要用%time:~0,2%%time:~3,2%%time:~6,2% (運行腳本的時間一定是在10-23點區間,否則0-9(H)腳本調用函數錯誤,無法運行)
2)如果要用%time:~1,1%%time:~3,2%%time:~6,2% (建議運行腳本的時間在0-9點這個區間,如果是>9點,
比如13點。會造成只顯示個位數字3,比如2019-1-20 時間13:26:20 會顯示2019012032620 從而影響時間的整體准確性)
3)或者是直接舍去時間,只用日期來定義文件名。
%date:~0,4%%date:~5,2%%date:~8,2%
比如2019-1-20 那么文件名會顯示為20190120.(如果需求是每天做一個備份,那么這樣命名是沒什么影響的,
如果是一天需要N個備份文件,請參照上面兩種時間設定)