中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-07 21:40
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 再谈批处理记录本身历史运行次数 查看 1,079 回复 13
楼 主 再谈批处理记录本身历史运行次数 发表于 2008-03-29 04:12 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
  谈批处理记录本身历史运行次数,实际上就是为了限制使用程序次数。经过自己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-03-29 09:45
plp626 +4 2008-04-02 14:19
批处理之家新域名:www.bathome.net
2 发表于 2008-03-29 04:41 ·  中国 香港 腾讯云
银牌会员
★★★
积分 1,436
发帖 739
注册 2007-10-11 17:44
18年会员
UID 99469
性别 男
状态 离线
不用生成临时文件的话,那就保存到注册表里吧
3 发表于 2008-03-29 09:47 ·  中国 陕西 西安 电信
社区乞丐
积分 -66
发帖 40
注册 2008-03-25 13:42
18年会员
UID 113959
性别 男
状态 离线
A SB!
4 大家还是要互相理解: 发表于 2008-03-29 09:57 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
  我真的觉得在这里学到了好多东西,也遇到了很多热心的人,确实感谢大家了。同时我认为无论是讨论什么样的问题,哪怕是再简单不过的问题,大家都要抱着共同提高的态度,都要互相理解互相支持,更是要有一种和谐的氛围。而不要动之以怒,甚至于发例于楼上的贴子。
  对了,我到现在还不明白楼上为什么要扣我两分,我说了这只是个人的一点总结而以,说错了就请指明,我定会虚心接受。
批处理之家新域名:www.bathome.net
5 发表于 2008-03-29 12:03 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
把写注册表的方法也总结到一起吧
6 发表于 2008-03-29 12:34 ·  中国 浙江 嘉兴 电信
初级用户
★★
积分 157
发帖 67
注册 2007-05-13 11:03
19年会员
UID 88378
性别 男
状态 离线
楼 主 改进建议
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 谢谢楼上的: 发表于 2008-03-29 12:56 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
谢谢你的建议,但我觉得有问题:
1 echo goto %n% ^>nul 2^>nul >>%0 将会生成一个内容为goto %n% >nul 2>nul 的临时文件%0;
2 删除最后一行就等于失去了记录历史次数的功能;
3 好像批处理不能删除自身任意一行吧?
批处理之家新域名:www.bathome.net
8 发表于 2008-03-29 14:26 ·  中国 浙江 嘉兴 电信
初级用户
★★
积分 157
发帖 67
注册 2007-05-13 11:03
19年会员
UID 88378
性别 男
状态 离线
要做个缓冲,跳转到临时BAT再操作,有点难度,不过还是好玩
9 发表于 2008-03-29 14:58 ·  中国 江苏 常州 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
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 发表于 2008-03-30 14:03 ·  中国 甘肃 兰州 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
不管怎么都必须用数据库
11 发表于 2008-03-30 14:26 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
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
12 发表于 2008-03-30 14:55 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
没必要使用goto并屏蔽输出提示
echo goto %a% ^>nul 2^>nul >>彩票选号器.bat
改为
echo :: %a% >>彩票选号器.bat
13 发表于 2008-03-30 15:11 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
18年会员
UID 112398
性别 男
状态 离线
首先谢谢zh159,但如:
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
14 发表于 2008-03-30 15:43 ·  中国 广西 玉林 博白县 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
20年会员
UID 44210
状态 离线
因为你要用最后一行作为计数,所以原最后一行写法有误:
goto 0 >nul 2>nul&goto :eof

改为
goto :eof
:: 0
论坛跳转: