|
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 |
|
|
abcd
银牌会员
    
积分 1436
发帖 739
注册 2007-10-11
状态 离线
|
『第
2 楼』:
不用生成临时文件的话,那就保存到注册表里吧
|
|
2008-3-29 04:41 |
|
|
maidu
社区乞丐
积分 -66
发帖 40
注册 2008-3-25
状态 离线
|
|
2008-3-29 09:47 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第
4 楼』:
大家还是要互相理解:
我真的觉得在这里学到了好多东西,也遇到了很多热心的人,确实感谢大家了。同时我认为无论是讨论什么样的问题,哪怕是再简单不过的问题,大家都要抱着共同提高的态度,都要互相理解互相支持,更是要有一种和谐的氛围。而不要动之以怒,甚至于发例于楼上的贴子。
对了,我到现在还不明白楼上为什么要扣我两分,我说了这只是个人的一点总结而以,说错了就请指明,我定会虚心接受。
|

批处理之家新域名:www.bathome.net |
|
2008-3-29 09:57 |
|
|
HAT
版主
       
积分 9023
发帖 5017
注册 2007-5-31
状态 离线
|
|
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 |
|
|
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 来自 甘肃.临泽
状态 离线
|
|
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 |
|
|
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 |
|
|
zh159
金牌会员
     
积分 3687
发帖 1467
注册 2005-8-8
状态 离线
|
『第
14 楼』:
因为你要用最后一行作为计数,所以原最后一行写法有误:
Quote: | goto 0 >nul 2>nul&goto :eof |
|
改为
goto :eof
:: 0
|

 |
|
2008-3-30 15:43 |
|