最近公司的项目,需要部署一个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个备份文件,请参照上面两种时间设定)