中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-07 22:41
48,041 主题排行 / 350,128 发帖 / 今日 3 篇 / 48,252 会员排行
DOS批处理 & 脚本技术(批处理室) » 再谈批处理记录本身历史运行次数
可打印版本  1,080 / 13
第1楼 bat-zw 发表于 2008-03-29 04:12
金牌会员 发帖 1,276 积分 3,105
再谈批处理记录本身历史运行次数
  谈批处理记录本身历史运行次数,实际上就是为了限制使用程序次数。经过自己n次尝试,用纯P来实现确实有点难度(起码对我来说),现在写下本人两种方法的小小总结,以供新人借鉴(老手们可不要笑话我啊):        
  第一种方法是生成临时文件,此文件在第一次运行时生成,可将其路径写的隐蔽点,如生成到系统文件夹system32中,如以下代码:
set puth=c:\windows\system32\ rem 设置路径
if exist %puth%a.txt goto run
cd . >%puth%a.txt
:run
set /p n=<%puth%a.txt rem 设置n值为a.txt第一行的数值
set /a n+=1 rem 运行一次数值n加上1
echo %n% >%puth%a.txt rem 重新输入a.txt中的数值
if %n% geq 10 goto :eof rem 如果n>=10结束运行
...................................
  第二种方法(应是本人的原创)从批处理自身获取数值并更新数值,不用生成临时文件,但运行一次会在批处理最后增加一行字符(做了处理后不影响运行),如以下代码(批处理名为b.bat):
for /f "tokens=2" %%i in (b.bat) do (
set n=%%i rem 从批处理最后一行中获取数值
)
set /a n+=1 rem 运行一次数值n加上1
if %n% equ 10 goto :eof  rem 如果n=10结束运行
echo goto %n% ^>nul 2^>nul >>b.bat rem 向批处理最后一行后添加数值
..................................................
goto 0 >nul 2>nul&goto :eof rem 最后一行

[ Last edited by zw19750516 on 2008-3-29 at 10:02 AM ]
第2楼 abcd 发表于 2008-03-29 04:41
银牌会员 发帖 739 积分 1,436
不用生成临时文件的话,那就保存到注册表里吧
第3楼 maidu 发表于 2008-03-29 09:47
社区乞丐 发帖 40 积分 -66
A SB!
第4楼 bat-zw 发表于 2008-03-29 09:57
金牌会员 发帖 1,276 积分 3,105
大家还是要互相理解:
  我真的觉得在这里学到了好多东西,也遇到了很多热心的人,确实感谢大家了。同时我认为无论是讨论什么样的问题,哪怕是再简单不过的问题,大家都要抱着共同提高的态度,都要互相理解互相支持,更是要有一种和谐的氛围。而不要动之以怒,甚至于发例于楼上的贴子。
  对了,我到现在还不明白楼上为什么要扣我两分,我说了这只是个人的一点总结而以,说错了就请指明,我定会虚心接受。
第5楼 HAT 发表于 2008-03-29 12:03
版主 发帖 5,017 积分 9,023
把写注册表的方法也总结到一起吧
第6楼 tvzml 发表于 2008-03-29 12:34
初级用户 发帖 67 积分 157
楼 主 改进建议
1 写到最后一行 加个标识,一是醒目,二是防止读值错误
2 先读取值后马上删除这行,再写下n+=1 产生的新行,这样不至于BAT文件增大。
3 B.BAT 用 %0 替换,这样就写自己本身,BAT名称任意了。

我刚进这里,删除最下面一行不会,希望高手指教。


for /f "tokens=2" %%i in (%0) do (
set n=%%i
)
set /a n+=1
if %n% equ 10 goto :eof
echo goto %n% ^>nul 2^>nul >>%0

[ Last edited by tvzml on 2008-3-29 at 12:38 PM ]
第7楼 bat-zw 发表于 2008-03-29 12:56
金牌会员 发帖 1,276 积分 3,105
谢谢楼上的:
谢谢你的建议,但我觉得有问题:
1 echo goto %n% ^>nul 2^>nul >>%0 将会生成一个内容为goto %n% >nul 2>nul 的临时文件%0;
2 删除最后一行就等于失去了记录历史次数的功能;
3 好像批处理不能删除自身任意一行吧?
第8楼 tvzml 发表于 2008-03-29 14:26
初级用户 发帖 67 积分 157
要做个缓冲,跳转到临时BAT再操作,有点难度,不过还是好玩
第9楼 terse 发表于 2008-03-29 14:58
银牌会员 发帖 946 积分 2,404
move 应该做到 只是楼主回复了 一定不要临时文件过度 我想在P运行中 还要改变其自身内容 请教下面的了

如果加行的话 那也可以用 FIND 处理
@echo off
type %0|find /v /c ""
pause
echo.>>%0

[ Last edited by terse on 2008-3-29 at 03:03 PM ]
第10楼 vkill 发表于 2008-03-30 14:03
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
不管怎么都必须用数据库
第11楼 bat-zw 发表于 2008-03-30 14:26
金牌会员 发帖 1,276 积分 3,105
Originally posted by vkill at 2008-3-30 14:03:
不管怎么都必须用数据库

我这个就不用数据库,一样能记录运行次数(用来进行使用次数限制),还不生成任何临时文件,请保存为彩票选号器.bat运行。


[ Last edited by zw19750516 on 2008-3-30 at 02:32 PM ]
第12楼 zh159 发表于 2008-03-30 14:55
金牌会员 发帖 1,467 积分 3,687
没必要使用goto并屏蔽输出提示
echo goto %a% ^>nul 2^>nul >>彩票选号器.bat
改为
echo :: %a% >>彩票选号器.bat
第13楼 bat-zw 发表于 2008-03-30 15:11
金牌会员 发帖 1,276 积分 3,105
首先谢谢zh159,但如:
Originally posted by zh159 at 2008-3-30 14:55:
没必要使用goto并屏蔽输出提示
echo goto %a% ^>nul 2^>nul >>彩票选号器.bat
改为
echo :: %a% >>彩票选号器.bat

这样就要把最后的一行也改成0,第一次运行就会报错,所以我认为不妥。
第14楼 zh159 发表于 2008-03-30 15:43
金牌会员 发帖 1,467 积分 3,687
因为你要用最后一行作为计数,所以原最后一行写法有误:
goto 0 >nul 2>nul&goto :eof

改为
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023