中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 再谈批处理记录本身历史运行次数
作者:
标题: 再谈批处理记录本身历史运行次数 上一主题 | 下一主题
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『楼 主』:  再谈批处理记录本身历史运行次数

  谈批处理记录本身历史运行次数,实际上就是为了限制使用程序次数。经过自己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 点积分     点击查看详情   
评分人:【 maidu 分数: -2  时间:2008-3-29 09:45
评分人:【 plp626 分数: +4  时间:2008-4-2 14:19




批处理之家新域名:www.bathome.net
2008-3-29 04:12
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
abcd
银牌会员





积分 1436
发帖 739
注册 2007-10-11
状态 离线
『第 2 楼』:  

不用生成临时文件的话,那就保存到注册表里吧

2008-3-29 04:41
查看资料  发短消息 网志  OICQ (470237592)  编辑帖子  回复  引用回复
maidu
社区乞丐





积分 -66
发帖 40
注册 2008-3-25
状态 离线
『第 3 楼』:  

A SB!

2008-3-29 09:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 4 楼』:  大家还是要互相理解:

  我真的觉得在这里学到了好多东西,也遇到了很多热心的人,确实感谢大家了。同时我认为无论是讨论什么样的问题,哪怕是再简单不过的问题,大家都要抱着共同提高的态度,都要互相理解互相支持,更是要有一种和谐的氛围。而不要动之以怒,甚至于发例于楼上的贴子。
  对了,我到现在还不明白楼上为什么要扣我两分,我说了这只是个人的一点总结而以,说错了就请指明,我定会虚心接受。



批处理之家新域名:www.bathome.net
2008-3-29 09:57
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  

把写注册表的方法也总结到一起吧

2008-3-29 12:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tvzml
初级用户





积分 157
发帖 67
注册 2007-5-13
状态 离线
『第 6 楼』:  

楼 主 改进建议
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 ]

2008-3-29 12:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 7 楼』:  谢谢楼上的:

谢谢你的建议,但我觉得有问题:
1 echo goto %n% ^>nul 2^>nul >>%0 将会生成一个内容为goto %n% >nul 2>nul 的临时文件%0;
2 删除最后一行就等于失去了记录历史次数的功能;
3 好像批处理不能删除自身任意一行吧?



批处理之家新域名:www.bathome.net
2008-3-29 12:56
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
tvzml
初级用户





积分 157
发帖 67
注册 2007-5-13
状态 离线
『第 8 楼』:  

要做个缓冲,跳转到临时BAT再操作,有点难度,不过还是好玩

2008-3-29 14:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 9 楼』:  

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 ]



简单!简单!再简单!
2008-3-29 14:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 10 楼』:  

不管怎么都必须用数据库

2008-3-30 14:03
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 11 楼』:  



  Quote:
Originally posted by vkill at 2008-3-30 14:03:
不管怎么都必须用数据库

我这个就不用数据库,一样能记录运行次数(用来进行使用次数限制),还不生成任何临时文件,请保存为彩票选号器.bat运行。
@echo off&color 5f&mode con cols=50 lines=8
title 彩票号码选取器
echo.&echo.&echo.
set /p password=请输入进入密码:
if "%password%"=="cn-dos.net" goto begin
for /f "tokens=2" %%i in (彩票选号器.bat) do (
    set a=%%i
)
set /a a+=1
set /a b=5-a
if %a% geq 5 goto wrong
echo goto %a% ^>nul 2^>nul >>彩票选号器.bat
cls
echo.&echo.&echo.
echo 由于没正确输入密码,你仅能使用5次,现在还剩%b%次
ping /n 3 127.1 >nul
:begin
cls
set a=35
echo.&echo.&echo.
set /p a=请输入在多少个数中选择(默认回车为35):
cls
set b=7
echo.&echo.&echo.
set /p b=请输入选择多少个数(默认回车为7):
:loop
set /a n=%random%%%a+1
for %%i in (%str%) do if "%n%" == "%%i" goto loop
set str=%str% %n%
set /a m+=1
if %m% lss %b% goto loop
cls
echo.&echo.&echo.
echo 选择出的号码为: %str%
pause
cls
echo.&echo.&echo.
echo     选择完毕,请按任意键退出!
pause >nul&goto :eof
:wrong
cls
echo.&echo.&echo.
echo 对不起,你无权再使用本软件!
ping /n 3 127.1 >nul
goto 0 >nul 2>nul&goto :eof
[ Last edited by zw19750516 on 2008-3-30 at 02:32 PM ]



批处理之家新域名:www.bathome.net
2008-3-30 14:26
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 12 楼』:  

没必要使用goto并屏蔽输出提示
echo goto %a% ^>nul 2^>nul >>彩票选号器.bat
改为
echo :: %a% >>彩票选号器.bat



2008-3-30 14:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 13 楼』:  

首先谢谢zh159,但如:

  Quote:
Originally posted by zh159 at 2008-3-30 14:55:
没必要使用goto并屏蔽输出提示
echo goto %a% ^>nul 2^>nul >>彩票选号器.bat
改为
echo :: %a% >>彩票选号器.bat

这样就要把最后的一行也改成0,第一次运行就会报错,所以我认为不妥。



批处理之家新域名:www.bathome.net
2008-3-30 15:11
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 14 楼』:  

因为你要用最后一行作为计数,所以原最后一行写法有误:

  Quote:
goto 0 >nul 2>nul&goto :eof

改为
goto :eof
:: 0




2008-3-30 15:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: