[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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. @echo off
  2. REG QUERY hkcr\.$$$ /v "cishu" 1>nul 2>nul||reg add hkcr\.$$$ /v "cishu" /d "0" /f >nul
  3. for /f "tokens=1-3" %%a in ('REG QUERY  hkcr\.$$$ /v "cishu"') do (set "cishu=%%c")
  4. if not "%cishu%"=="0" echo 已经运行了 %cishu% 次
  5. set /a "cishu+=1"
  6. reg add hkcr\.$$$ /v "cishu" /d "%cishu%" /f >nul
  7. echo.
  8. set /p "a=按 回车 直接退出;空格 + 回车 清除运行记录。 "
  9. if defined a reg delete  hkcr\.$$$ /f & pause
复制代码

TOP

回复 28# batman

回复 28# batman

这个代码有点问题,直接关掉程序的话不会计数,应该改一下才可以.
  1. ::3
  2. @echo off
  3. set /p num=<%~fs0
  4. set "num=%num:~2%"
  5. if %num% neq 0 echo.&echo 程序已运行了%num%次
  6. set /a num+=1
  7. for /f "delims=" %%i in (%~fs0) do (
  8.     if not defined flag (
  9.        echo ::%num%>%~fs0&set "flag=a"
  10.        ) else (
  11.        echo %%i>>%~fs0
  12.     )
  13. )
  14. pause>nul
复制代码
pause>nul 这个放在计数后面,不然不按键盘,直接把程序关掉的话不会计数.

TOP

@echo off
for /f "tokens=2" %%i in (%~nx0) do (set sx=%%i)
if %sx%==0 goto 1
echo 文件已经运行%sx%次
:1
set /a sx+=1
echo aloc %sx% >>%~nx0
pause>nul&&exit
aloc 0

注意代码最后有1空行。。

TOP

hi, netbenton也来拉
现在如果做的话打算用 assoc 关联一个特殊项,该项记录着次数。
assoc .次数=n
估计实际上是根改注册表差不多

[ 本帖最后由 523066680 于 2009-11-20 08:58 编辑 ]

TOP

最简单的,[会越来越长]

  1. @echo off
  2. set/a n=%~z0-110
  3. if %n% gtr 0 echo 程序已经运行了:%n%次
  4. set/p =a>%~f0
  5. pause
  6. goto :eof
  7. ::
复制代码

TOP

不改都有错误。
程序已经运行了-80次
请按任意键继续. . .
论坛标题管理观察员

TOP

  1. @echo off
  2. for /f "skip=9" %%i in ('type %0') do set a=%%i
  3. >>%0 echo 1
  4. if "" EQU "%a%" (pause &goto :eof)
  5. for /f %%i in ('echo %0') do set b=%%~zi
  6. set /a c=(%b%-%a%)/3-80
  7. echo 程序已经运行了%c%次
  8. pause&goto :eof
  9. ::此行号为skip所用
复制代码

不要改里面的东西哇, 不燃会有错误, 呵呵
最后需要有一行空行


  1. @echo off
  2. for /f "skip=9" %%i in ('type %0') do set a=%%i
  3. >>%0 echo 1
  4. if "" EQU "%a%" (pause &goto :eof)
  5. for %%i in (%0) do set b=%%~zi
  6. set /a c=(%b%-%a%)/3-76
  7. echo 程序已经运行了%c%次
  8. pause&goto :eof
  9. ::此行号为skip所用
复制代码

应该是这个 , 上面的错了


[ 本帖最后由 a794685135 于 2008-11-2 16:16 编辑 ]

TOP

@echo off
set n=0
goto :a
  :add
   set /a n+=1
  goto :eof
:a
call :call
if %n% gtr 0 (echo,曾经打开%n%次)
echo,call :add>>tt1.bat
pause

:call

TOP

回复 41楼 的帖子

还真是行的,谢谢指教。

[ 本帖最后由 shqf 于 2008-10-25 20:00 编辑 ]

TOP

回39楼 shqf

这样算吗?
  1. @echo off
  2. set "str=echo 这里是中间那段"
  3. for /f "delims=" %%a in ('type %0') do (
  4.    if not defined god (
  5.       set "god=hell"
  6.       >%0 echo %%a
  7.    ) else (
  8.       if not "%%a"=="%str%" (
  9.          >>%0 echo %%a
  10.       ) else (
  11.          >>%0 echo echo 这里是已经改写的中间那段
  12.       )
  13.    )
  14. )
  15. echo 这里是中间那段
  16. pause
复制代码

TOP

原帖由 batman 于 2008/10/24 23:06 发表

echo 0>time只会生成一个空文件

已经改过了,请再看看
  1. @echo off
  2. if not exist time echo 0 >time
  3. set/p a=<time
  4. set/a a+=1
  5. echo 这是第%a%次运行程序
  6. echo %a% >time
  7. pause
复制代码

TOP

之前一直认为批处理是难以改写文本文件的,最多会在文尾添加一句,但那样在本题中文本文件会越来越长。细细体会了
  1. for /f "usebackq delims=" %%a in ("%~0") do (
  2.    if not defined flag (set flag=a&echo ::%n%>"%~0") else echo %%a>>"%~0"
  3. )
复制代码
这一句,知道文件第一句也是可以改写的。那如果在文件中间的,能改写吗?

TOP

原帖由 pusofalse 于 2008-10-24 13:58 发表
回复more兄,好像看错题意了。第一次运行时什么也不会输出,到运行第二次时才输出“已经运行1次”。25楼同是如此的问题。

我这里显示没有问题呀:
This is the first time
2 times already
3 times already
4 times already
5 times already
6 times already

TOP

回复 32楼 的帖子

别学他们乱用&、&&、||之类的命令连接符
这样会让代码的可读性降低
保持你的风格即可
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表