[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-030】批处理计算程序运行次数

出题目的:
  1、通过解题掌握改写文本技巧
  2、通过解题加强对defined特性的理解
  3、通过解题提高综合运用能力
加分原则:
  1、完善代码加分15分 
  2、其中思路独特基分5分
  3、其中无临时文件基分4分(解题的重要技巧)
  4、其中代码高效基分3分
  5、其中代码简洁基分2分
  6、其中不使用变量延迟基分1分
题目如下:
  要求用纯批处理记录本身运行次数,并在运行时进行提示。如:运行第一次时无提
示,运行第二次时提示已经运行了一次。请在解题时尽量不要使用变量延迟(并不是
不能使用)。
个人请求:
  请版主级会员暂缓贴代码,给新人一段独立思考的时间
总结下:
       通过大家的踊跃跟贴,本题基本得到圆满解决,本人总结了各人的代码分类如下:
       1、通过改写批处理本身来记录运行次数,见4、5、15、28楼的代码,思路都是将运
行次数每次改写到批处理的第一行且均用::来使批处理忽略运行本行代码,这也是大家都认
可的方案;
       2、通过向批处理本身追加数据来记录运行次数,见31、35、36楼的代码,思路都是将
运行次数每次追加到批处理的最后一行,缺点是会让批处理本身越来越大,同时原批处理最
后一行一定要是空行;
       3、通过生成其它文件来记录批处理运行次数,见33楼的代码,思路是将批处理运行的
次数写入其它文件,并每次运行时从记载数据的文件读取一次数据,缺点就是要另处生成临
时文件;
       4、将运行次数记录并写入注册表,在本贴中仍未见相关代码,思路是将批处理支行的
次数当成数据写入注册表的新建项,并在每次运行时从注册表该项中读取一次数据,缺点对
注册表如果不是很熟悉将会造成未知的系统错误。
***共同提高***

这里我只提示一下 运行 次数记录的一般方法:
1、将次数写入自身文件的最后,当然这种方法不管是读取,还是再更新写入相对都比较麻烦,但数据相对安全一点点。
2、将数据记录到自身文件名,如某文件叫“test.bat”当运行第二次时,就将它的文件名改为test2.bat,依此类推
3、借鉴一般软件的记录方法:
1>写配置文件;
2>将记录写入注册表等
不过第三种方式,似乎楼主有限制....
我不知道这种方式是否属于它的纯批处理的范畴,呵呵。

TOP

就这些要求吗?比如说限制代码的最后一行绝对得是空行等。。。
心绪平和,眼藏静谧。

TOP

  1. ::0
  2. @echo off
  3. set /p var=<"%~0"
  4. set "var=%var::=%"
  5. set /a n=var+1
  6. for /f "usebackq delims=" %%a in ("%~0") do (
  7.    if not defined flag (set flag=a&echo ::%n%>"%~0") else echo %%a>>"%~0"
  8. )
  9. ::
  10. if %var% neq 0 echo 已经运行了%var%次
  11. pause
复制代码

[ 本帖最后由 随风 于 2008-10-23 16:27 编辑 ]
1

评分人数

    • batman: 真不想给你加分PB + 10
技术问题请到论坛发帖求助!

TOP

  1. :0
  2. @echo off
  3. SET/p N=<%0>nul
  4. if %n::=% gtr 1 echo 已运行 %n::=%次 %~0
  5. set/a n=%n::=%+1
  6. for /f "delims=" %%i in ('type %0') do (
  7.    if not defined str (
  8.    set str=%%i
  9.    >%0 echo :%n%)else >>%0 echo %%i)
  10. ::
  11. echo.&echo.这是第 %n::=%次 到这里 想做什么呢?&echo.&pause
复制代码

[ 本帖最后由 terse 于 2008-10-23 16:35 编辑 ]
1

评分人数

    • batman: 兄弟也是一样PB + 10

TOP

出手比我还快  你真快

TOP

奇怪。。。到了第九次时出现了奇怪的现象,测试两位的代码:
  1. 'rvar次' 不是内部或外部命令,也不是可运行的程序
  2. 或批处理文件。
  3. 请按任意键继续. . .
复制代码
  1. 已运行 9次 C:\Documents and Settings\Administrator\桌面\terse.bat
  2. '馐堑?10次' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. 请按任意键继续. . .
复制代码
编码未变,仍旧是ansi。
两位的代码都是同样的问题,唯有第9次不行。。。
心绪平和,眼藏静谧。

TOP

回复 7楼 的帖子

找到原因了,以改。
加一句注释行就可以了,可能是因为改变了原文件,for下面的第一行无法正确运行。
技术问题请到论坛发帖求助!

TOP

你们这么快就贴代码,摆明了不给新人机会嘛,嘿嘿^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

看来如随风兄说的  改变了原文件的缘故 序号升一位就有这个问题  FOR前是好的

TOP

两位出手不可谓不快,但是否这样等于剥夺了新人们独立思考的机会呢?所以暂时全部
屏蔽。。。

[ 本帖最后由 batman 于 2008-10-23 17:05 编辑 ]
***共同提高***

TOP

一看到有 batman 的回帖就估计是批评我们的了。。 ^_^
不过此题,说难不难,说易也不易,下次出题能否声明一下针对人群呢?
技术问题请到论坛发帖求助!

TOP

原帖由 随风 于 2008-10-23 17:10 发表
一看到有 batman 的回帖就估计是批评我们的了。。 ^_^
不过此题,说难不难,说易也不易,下次出题能否声明一下针对人群呢?

真的是对不起,本人是一边做报表一边出的题,终于还是有所遗漏:没能事先做出声明。
是本人的错,请各位见谅了。。。
***共同提高***

TOP

用临时文件夹能行么,嘻嘻~

TOP

与随风兄的代码思路一样,测试代码:
  1. ::-1
  2. @echo off 2>nul 3>nul
  3. set /p n=<"%~0"
  4. set "n=%n::=%"
  5. set /a n+=1,1/n && call echo 程序已经运行%%n%%次
  6. for /f "delims=" %%i in ('echo ::%n%^&more +1^<"%~0"') do (
  7.         if not defined flag (set flag=a&echo %%i>"%~0") else echo %%i>>"%~0"
  8. )
  9. pause
复制代码
不过以下代码还有两个目的:
1、2>nul 3>nul
2、不生成临时文件修改自身文件内容除了有随风兄的写法外,还可以这样:
  1. for /f "delims=" %%i in ('echo ::%n%^&more +1^<"%~0"') do (
  2.         if not defined flag (set flag=a&echo %%i>"%~0") else echo %%i>>"%~0"
  3. )
复制代码
1

评分人数

    • batman: 大家思路竟是如此的相同PB + 10

TOP

返回列表