最近公司的项目,需要部署一个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%