最近公司的项目,需要部署一个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%
date变量值如下的各个操作的意义如下:
%date:~0,4% 表示从左向右指针向右偏0位,然后从指针偏移到的位置开始提取4位字符,结果是2014(年的值) %date:~5,2% 表示指针从左向右偏移5位,然后从偏移处开始提取2位字符,结果是03(月的值) %date:~8,2% 表示指针从左向右偏移8位,然后从偏移处开始提取2位字符,结果是01(日的值) %date:~5% 表示指针从左向右偏移5位,然后提取所有的值 %date:~-5% 表示指针反方向偏移,从最右端开始,偏移5位,然后从指针处提取左边的所有数值。
导致脚本无法正常运行的语句如下:
%time:~0,2%%time:~3,2%%time:~6,2%
time变量值如下的各个操作的意义如下:
%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% 注:md是创建目录的意思
用%time:~0,2%%time:~3,2%%time:~6,2%时有个问题, 就是如果TIME 是00点的时候,电脑显示的是0 不是00所以%time:~0,2%就报错了。
例子:2019-4-22时间9:26:10
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:20190422 92610(9前面是空格) fileDate2:20190422092610
总结:
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-4-22 时间13:26:20 会显示2019022232610 从而影响时间的整体准确性)
3)或者是直接舍去时间,只用日期来定义文件名。
%date:~0,4%%date:~5,2%%date:~8,2%
比如2019-4-22 那么文件名会显示为20190422.(如果需求是每天做一个备份,那么这样命名是没什么影响的,如果是一天需要N个备份文件,请参照上面两种时间设定)
4)set "t=%time:~,2%%time:~3,2%%time:~6,2%" 以当前日期时间命名(此方式还没有试的,不知道0-9这个区间行不行的)
5)bat获取系统时间,并去掉时间小时前面的空格(如下三行必须一起使用)
set h=%time:~0,2%
set h=%h: =0%
set timedate=%date:~0,4%%date:~5,2%%date:~8,2%%h%%time:~3,2%%time:~6,2%