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

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

[复制链接]
发表于 2008-10-24 22:22:01 | 显示全部楼层
  1. @echo off
  2. call :n
  3. calc
  4. exit /b
  5. -------------------------------------------------------------
  6. :n
  7. setlocal&set m="%~f0"
  8. for /f "usebackq" %%a in (%m%)do if defined f (set n=%%a)else if "%%a"=="::n" set f=1
  9. set/an+=1&if %n% geq 1 echo 已经运行了%n%次!&pause
  10. for /f "usebackq delims=" %%a in (%m%)do if defined f (echo.%%a>%m%&set f=)else if defined x (echo.%n%>>%m%&goto:eof)else echo.%%a>>%m%&if "%%a"=="::n" set x=1
  11. ::n
  12. 0
复制代码
发表于 2008-10-24 22:52:31 | 显示全部楼层
为啥各位大大都喜欢将代码写得那么紧凑?看得很辛苦哦...
发表于 2008-10-24 22:52:46 | 显示全部楼层
  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
复制代码

[ 本帖最后由 mkl 于 2008-10-25 11:00 编辑 ]
 楼主| 发表于 2008-10-24 23:06:53 | 显示全部楼层
原帖由 mkl 于 2008-10-24 22:52 发表
@echo off
if not exist time echo 0>time
set/p a=time
pause

echo 0>time只会生成一个空文件
发表于 2008-10-24 23:07:58 | 显示全部楼层
来个会越来越长的:
  1. @echo off
  2. rem 最后一行不能是空行。
  3. for /f %%a in ('findstr /v $ "%~f0"') do set /a n=%%a+1 & if "%%a" neq "pause" echo 已经运行%%a次
  4. >>"%~f0" (echo\& <nul set /p=%n%)
  5. pause & exit /b
复制代码
发表于 2008-10-24 23:32:49 | 显示全部楼层
再来一个越来越长的,呵呵

  1. @echo off 2>nul 3>nul
  2. for /f "delims=" %%i in (%~0) do set "n=%%i"
  3. set /a n+=1,1/n && call echo 第%%n%%次运行
  4. pause>nul
  5. >>%~0 echo %n%
  6. goto :eof
  7. -1

复制代码
发表于 2008-10-24 23:44:16 | 显示全部楼层

回复 32楼 的帖子

别学他们乱用&、&&、||之类的命令连接符
这样会让代码的可读性降低
保持你的风格即可
发表于 2008-10-25 09:25:01 | 显示全部楼层
原帖由 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
发表于 2008-10-25 10:08:00 | 显示全部楼层
之前一直认为批处理是难以改写文本文件的,最多会在文尾添加一句,但那样在本题中文本文件会越来越长。细细体会了
  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. )
复制代码
这一句,知道文件第一句也是可以改写的。那如果在文件中间的,能改写吗?
发表于 2008-10-25 11:03:18 | 显示全部楼层
原帖由 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
复制代码
发表于 2008-10-25 11:27:53 | 显示全部楼层

回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
复制代码
发表于 2008-10-25 12:40:23 | 显示全部楼层

回复 41楼 的帖子

还真是行的,谢谢指教。

[ 本帖最后由 shqf 于 2008-10-25 20:00 编辑 ]
发表于 2008-10-26 13:43:54 | 显示全部楼层
@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
发表于 2008-10-30 17:31:06 | 显示全部楼层

  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 编辑 ]
发表于 2008-10-30 17:38:38 | 显示全部楼层
不改都有错误。
程序已经运行了-80次
请按任意键继续. . .
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:52 , Processed in 0.010892 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表