中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-14 17:37
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [原创]计划任务小程序 [06.12更新]
可打印版本  4,381 / 19
第1楼 jastyg 发表于 2006-06-08 19:20
中级用户 发帖 82 积分 219
[原创]计划任务小程序 [06.12更新]
自己没有学习过DOS,恐怕这个要归结于接触电脑的时间比较晚,还好发现了这个好地方。那个开心啊~~~而且感觉只要来这里就一定有收获!
首先不算多也在坛子里泡大半年了,自己水平很低报着学习的态度来看待任何问题,不过有幸的是整个论坛的氛围很好,除了板油积极的态度,更重要的这里有着一帮热心并且水平很高的斑竹。可以说是我们很好的老师,在此向帮助过我的朋友表示感谢。

花了2天时间写了这个小程序,主要是想把在这里的所学集中的使用一次,当然是比较低级的程序,希望大家不要见笑并给予支持。

请各位看看有什么写的不妥或者不正确的地方,很乐意接受意见。

更改时间:2006.6.9 10时
早上花了点时间加了批注,等于是自己再复查一遍以有的问题,果然发现几个地方的问题。:P,附件没有更新存在几个大小写的问题


更改时间2006.6.12 13时,加入了对时间和日期的检验




第一天写好之后感觉一切很好,不过在经过自己的几次测试后发现了不少问题,现在把自己已知的问题都改了。目前自我感觉很好(当然老师们看了肯定会发现有很多毛病,呵呵)
附件里有我加过壳的,可以直接使用。感觉可以跟AT命令有的一拼。

[ Last edited by jastyg on 2006-6-12 at 16:09 ]

附件
etime.rar (63.43 KiB)
第2楼 namejm 发表于 2006-06-08 20:17
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  把你的代码copy下来试运行了一下,初步发现了如下几个问题:
  1、每一步操作只有输入提示,而没有该输入的功能解释,让人不知道输入之后将执行什么操作;建议对每一步操作作功能提示;
  2、不知道该输入什么命令查看你的帮助内容;即使输入/? /help等你指定的命令,但运行的是另外的功能;建议修改代码;
  3、@echo off之后的命令没必要再次用@来隐藏;建议删除重复的@以精简代码;
  4、代码中,标号的命名一会用英文,一会用拼音,比较混乱;各部分的功能有的甚至用数字来表示,让人难以一下子明白该标号下的内容是什么功能;建议对标号统一命名,最好是能够见名知义;
  5、输入部分没有错误检测,如果输入有误,程序运行时有可能发生意外;建议对输入部分作错误检测;
  6、设置变量的时候,用到了rem、tmp等有特定含义的变量,个人觉得会对CMD环境产生影响(没有作进一步验证,有待各位达人给出权威结论),建议用另外的字符替换它们;
  呵呵,一口气说了你的代码一大堆缺点,希望别介意。
  本人正在完善一个文件备份脚本程序,希望你能关注一下,其中部分代码对你完善这个脚本会有所帮助,同时,也希望你能对我的脚本提一些建议。
下面是我的脚本在本论坛的地址:
文件备份器http://www.cn-dos.net/forum/viewthread.php?tid=20747&fpage=0&highlight=&page=1
  

[ Last edited by namejm on 2006-6-8 at 20:30 ]
第3楼 jastyg 发表于 2006-06-08 20:43
中级用户 发帖 82 积分 219
1、每一步操作只有输入提示,而没有该输入的功能解释,让人不知道输入之后将执行什么操作;建议对每一步操作作功能提示;

这个我觉的没必要详细解释。只需要跟向导走应该没问题的。

2、不知道该输入什么命令查看你的帮助内容;即使输入/? /help等你指定的命令,但运行的是另外的功能;建议修改代码;

我这边在XP/2K3下 输入 etime /? or etime /h是可以查看的,不知道你的是什么系统?2000由于没有环境,所以我测试不了。

3、@echo off之后的命令没必要再次用@来隐藏;建议删除重复的@以精简代码;本人愚昧没发现有多余的,请明确指出,谢谢

4、代码中,标号的命名一会用英文,一会用拼音,比较混乱;各部分的功能有的甚至用数字来表示,让人难以一下子明白该标号下的内容是什么功能;建议对标号统一命名,最好是能够见名知义;

这个是因为当时自己设计的时候没想的很周全,导致测试的时候问题多多,没办法才这样,修修补补的。呵呵

5、输入部分没有错误检测,如果输入有误,程序运行时有可能发生意外;建议对输入部分作错误检测;

做了简单的输入检测,我想要求你输入日的时候,最常见的是输入比如,7号那天的话,一般是07 OR 7。想不到难道使用者会输入为70?

6、设置变量的时候,用到了rem、tmp等有特定含义的变量,个人觉得会对CMD环境产生影响(没有作进一步验证,有待各位达人给出权威结论),建议用另外的字符替换它们;

这个确实是个缺陷,谢谢兄的明确指出,不过还好我目前测试还没到影响使用的地步


谢谢你提出的宝贵意见,在学习的过程中难免会出现很多问题,你的意见我会接受的。
第4楼 namejm 发表于 2006-06-08 21:48
荣誉版主 发帖 1,737 积分 5,226 来自 成都
Re jastyg:

  还在揣摩兄的脚本是如何运作的:)
  按照一般人使用bat程序的习惯,一般是双击该脚本来运行的,没有谁会先打开cmd窗口,然后再输入bat程序的完整路径来运行吧?所以说,应该在双击bat后打开的第一个界面中,就应该有该程序的功能介绍,或者是提示输入某条命令或某个字符查看该脚本的帮助内容。正是因为这个习惯问题,所以当双击这个脚本来运行的时候,就直接输入/?希望能查看你这个脚本的帮助,结果跳出了不相关的帮助内容,几乎让我怀疑我的CMD神经错乱了呢:)
  @echo off之后的@color 1f一句中,可把@去掉。
  关于错误检测一节,我的意见是这样的:如果在输入的时候,不小心直接就按了回车,也就是说输入为空的时候,运行会出意外——你不能保证别人什么时候都会正确地输入吧?还有其他输入出错的情况,请多为粗心的用户考虑一下吧。另外一种情况:在你这个代码中,输入时间一项没有作说明就很有问题,到底应该输入时间的整点数呢,还是输入带冒号的格式?要不要精确到秒?……
  因为批处理中,rem起注释的作用,%tmp%引用的是临时文件目录,把它们设置为变量在你目前这个脚本中没有什么问题,但是,还是建议不要用把批处理的命令或者系统环境变量设置为变量,以免在代码量大的情况下,引用得晕头转向的时候出错。良好的代码编写习惯是写出正确代码的一大保证,你说呢?
  如果要追求完美,还有很多地方值得完善:比如,可考虑去掉CMD窗口的下拉条,以防止新手乱拉后找不到有内容的位置。
  嘿嘿,老挑你毛病,再次希望别介意。
  
第5楼 jastyg 发表于 2006-06-08 22:08
中级用户 发帖 82 积分 219
re: namejm
兄说的很有道理,可能是自己没写过程序,考虑的真的是很不周到。
@color 1f一句中的@是自己的一时疏忽,因为程序测试的时候问题多多啊,所以就直接在第一行加了:@echo off,以便于测试。关于输入为空,我已经想到怎么做了,谢谢兄的提醒。对于说明确实是应该加在程序的开始,这样更明了。时间的格式是20:05这样的。

兄对我提出的意见使我收益颇深啊,我的原意也是这样的,把自己写的放出来给大家看,希望得到的就是提出我的不足啊。很是感谢你。

兄的贴我刚才也看了,佩服你的耐心和水平,你的贴我是没看完,一来没耐心,二者很多地方看不懂,见笑了~~~~
第6楼 namejm 发表于 2006-06-08 23:05
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  说到我的水平,其实看我的注册时间就可以看出来了;再有,我目前的工作和计算机领域相隔十万八千里,在外人看来很难把两者联系起来。只是自己对电脑很感兴趣,所以就在坛子里泡上了:)在论坛里学到了很多东西,真的很感谢这里的众多高手。呵呵,似乎扯远了点。
  嘿嘿,我又要挑你的毛病了哈——好象专门和你过不去,你可别拿板砖砸我呀。
  goto kaishi和:kaishi这两句,因为是紧跟在一起的,按照bat命令的执行顺序,是自上而下执行的(跳转除外),所以goto kaishi一句可省略;
  if "%1"=="0" set d=0&set riqi=0& goto t一句中,set d=0和set riqi=0可省略,CMD中不用初始化变量值的(呵呵,CMD里有“初始化”的说法吗?我也不是很懂,姑且这么叫吧),当然,这样做也没有运行出错;(后来参考了其他帖子,发现这段言论是错误的,设置初始值为0是有必要的)
  set /a tmp=%date:~8,3%+0 >nul这句中+0起什么作用?
  if errorlevel 9167 goto tmp1一句中,错误码9167是什么含义?是判断操作系统版本语句吗?看不太明白,请兄解释一下;
  echo %date:~8,2% >tem.txt find "08" tem.txt >nul if not errorlevel 1 set riqi=8&goto tmp3 这几句看不太明白:为什么要查找"08"这个字符?起什么作用?
  在每次输入完毕之后,建议用cls命令清屏,不要让上一次的输入保留在屏幕上。
  另外,感觉你写代码的时候,逻辑理得不是很顺,建议用以下顺序把代码串起来:先按照正确输入时的情况把每一步骤的代码写在一起,然后再把有分支流向的代码写在一堆,最后再把各种错误检测代码放在一块,以标号分割的每一节代码最好加上注释,表明本节的功能,觉得重要的地方也可以考虑添加注释。如果这样做的话,就会让人很快就看出你写的代码的逻辑结构,不仅方便自己以后完善代码时快速找到位置,也能让别人很快看出你的错误出在哪里。
  由于自己的水平有限,目前只提出了如上几个问题,更多可完善之处,还需要大家来发现。

[ Last edited by namejm on 2006-6-9 at 00:36 ]
第7楼 jastyg 发表于 2006-06-08 23:34
中级用户 发帖 82 积分 219
re: namejm
根据兄的提示,我已经做了部分修改,大批量的改自己也眼花,呵呵!

set /a tmp=%date:~8,3%+0 >nul这句中+0起什么作用?
这个其实我也是没办法,兄要仔细看一下SET/?就会得到08,09是无效的数字,因为8,9不是有效的8进制位数。
所以运行上面的代码就会出错。通过 echo %errorlevel %得到 errorlevel =9167。
因为8,9是无效的,所以如果输入日期为8,9的时候我的程序就不可能正确(PS:昨天是7号,我测试好的,今天就不行,后来才发现是这个问题,而且是除了8,9其他都没问题)
echo %date:~8,2% >tem.txt find "08" tem.txt >nul if not errorlevel 1 set riqi=8&goto tmp3 
通过把指定的日期里显示日的字符导出到TEM。TXT里然后查找,如果有8,就设置%riqi%=8(也就是8号),同理得到9号。
因为我是通过if "%riqi%%time:~0,5%"=="%d%%t%" goto run来确定数值是否一致的。

确实逻辑性是差多了,见笑了,呵呵。能用知足~~~。
有了这次的经验以后应该要好的多了~~
多谢兄的耐心指点
不早了,早点休息。明天继续盼兄回复~~~

PS:自己也发现了还有些问题不足,明天想办法看能不能解决,比如用户误输入特殊符号之类的,还望兄给出好的思路。

[ Last edited by jastyg on 2006-6-8 at 23:40 ]
第8楼 namejm 发表于 2006-06-09 00:00
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  比起我那个文件备份器700多行的代码来说(不过很多是rem和echo语句,是我故意夸张的说法),你这100多行的代码量算小的了,但是我依然能很快找到问题出在哪一句,正是得益于自己最开始的时候把逻辑顺序理得比较顺了(不敢说是最好的逻辑顺序),但愿你也能弄一个方便自己修改的顺序出来。
  关于输入错误检测,在我那个文件备份器的帖子里讨论得比较多,你花点时间慢慢看就会明白的。
  给你个建议:写代码的时候,尽量少产生临时文件,如果要产生临时文件,多想想能不能用for语句及&、&&、|和||等连接符来避免临时文件。
  还不能很好地领会你的代码,但是直觉告诉我,set /a tmp=%date:~8,3%+0 >nul一句对8和9这两个数应该有更简洁的处理办法,嘿嘿,问问willsort老大,他应该有办法的。
第9楼 namejm 发表于 2006-06-09 00:55
荣誉版主 发帖 1,737 积分 5,226 来自 成都
to jastyg:
  
  版主给你的帖子划红杠杠啦,你可要加油哇,争取弄上置顶或者精华:P
  俺睡觉去也~~~~~
第10楼 willsort 发表于 2006-06-09 02:13
元老会员 发帖 1,512 积分 4,432
Re jastyg:

首先,“原创”代码都是值得赞赏和鼓励的,这是我将此主题红色下划线高亮的决定性考量。

其次,此主题存在许多技术性细节可以探讨,所以它具有成为精华主题的潜质;当然,在此之前我们首先需要对主题中的代码进行初步的完善,即 namejm 兄所提到的框架逻辑的改善,主要包括每个模块的功能相对独立,标签名清晰易懂,同时有适当的空行作为间距。

再次,建议你的代码发布方式参考 namejm 兄的原创主题,新的代码将不断更新在主题的首帖中,并在主题标题中标明变化的版本号和更新日期。另外,建议你转贴代码时,在代码前后使用[code]和[/code],这样可以防止代码中的某些特殊字符被转义,便于浏览和复制,同时凸现代码的特殊性。

最后,关于 namejm 兄交给我的 08/09 问题,我是这样考虑的。之所以会出现 08/09 被识别为八进制数的问题,是因为使用了set/a命令,而我观察了代码中出现的所有set/a语句,都只是将日期值加零,而我看不出它有什么实际的意义。或许,你是想实现日期字符串向整型数值的转换,但这在批处理中是不需要实现也很难实现的,所有会处理整数的命令行程序都会自行将字符串数字转换为整型数值,因为这是命令行环境所固有的约定。

当然,08/09问题可以更简单地解决,如果你确实需要对日期值进行set/a运算,我可以提供相应的方案。

[[i] Last edited by willsort on 2006-6-9 at 02:18 [/i]]
第11楼 jastyg 发表于 2006-06-09 08:51
中级用户 发帖 82 积分 219
re: namejm
限于能力的问题,有的其实我想做,但做不了,正如您所说的用FOR等语句,但是我对这方面了解的不深入,当然也看了不少这方面的帖,真的感觉深了点,呵呵。慢慢来~~

re:willsort
首先谢谢斑竹对我多次的帮助,关于SET/A我是这样理解并这样做的,由于我在取日期这个值的时候存在这样的问题,比如单号的时间1-9号,但我取值必须要取2个字符的值否则等到双号的就出错了,即这样比如是7号的话,取到的值为:07,如果当我指定的时间输入为7的话,则两边不等,语句将执行错误,所以我通过取得当前日期的时候通过+0使得为十位数去空,同理,也给用户输入的日期做了去十位空的处理,这样语句能顺利运行。

当然,很乐意斑竹能给出更好的方案。
我会尽量抽点时间出来给上面做个批注(呵呵,我自己看的都有点乱,如果不是自己写的真没耐心看下去了)

PS:世界杯到了,又是折磨人的日子啊~~~

[ Last edited by jastyg on 2006-6-9 at 21:40 ]
第12楼 jastyg 发表于 2006-06-09 11:32
中级用户 发帖 82 积分 219
关于非法字符的检验我相出了一个方法,但感觉有点烦琐,先贴出来:
@echo off
set /p da=
for %%i in (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,?,h,H,/?,/h,/H) do if "%da%"=="%%i" goto ok
goto warng
:ok
echo ok
goto exit
:warng
echo 错误
:exit

这样对日期的检测确实可以,但时间格式的检验呢?
第13楼 jastyg 发表于 2006-06-09 11:55
中级用户 发帖 82 积分 219
对于时间的检测,想到一个愚昧的方法
把用户输入的时间分段进行日期一样的检验。

不知道有没更好的方法?
第14楼 willsort 发表于 2006-06-09 17:58
元老会员 发帖 1,512 积分 4,432
Re jastyg:

从11楼回复中理解了兄使用 set/a 的意图,即将日期值可能含有的零前缀剔除,使之有统一的格式以便于比较。

嗯,这个问题可以从两方面来看:

1、所有的日期都保证它含有可能的零前缀,这样可以进行比较。因为系统日期通常都具有可能的零前缀,所以我们通常只需要负责用户输入的日期变量即可。而具体采用的将是先补齐再截取的方案,比如:

set today=%date:~8,2%
set /p day=请输入日期:
set day=0%day%
set day=%day:~-2%
echo 输入的日期:%day%;系统的日期:%today%;

2、所有的日期都保证它不含有可能的零前缀,这样也可以进行比较。因为系统日期通常都具有可能的零前缀,所以我们需要同时负责用户输入的日期值和系统的日期值。这里我们采用先加10000或1000然后再求余的办法。比如

set today=%date:~8,2%
set /p day=请输入日期:
set /a today=100%today% %% 100, day=100%day% %% 100
echo 输入的日期:%day%;系统的日期:%today%;
第15楼 namejm 发表于 2006-06-09 19:14
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  老大的办法还真多哈,挺巧妙的。

to jastyg:

  其实没必要注释这么多内容,注释多了反倒有累赘感。

  再有,在帖代码的时候,你可以用这个方法,以保证某些字符不被网页转换掉,同时也方便别人复制你的代码作测试之用:先输入 [code] 和 [/code] ,然后在两者之间粘贴代码,然后发表就成了,其实挺简单的。最好是用“回复”模式来编辑,里面有更多的格式可供选择;“快速回复主题”模式可供选择的格式几乎没有,对网页代码比较熟悉的可以在此手工输入代码来编辑,如果你不熟悉的话,建议还是采用“回复”模式来弄吧。

[[i] Last edited by namejm on 2006-6-9 at 19:16 [/i]]
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023