中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-01 19:03
48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,249 会员排行
DOS批处理 & 脚本技术(批处理室) » 能不能写一个启动电脑规定次数后执行的自动批处理命令
可打印版本  3,626 / 15
第1楼 zwzhb 发表于 2006-05-11 17:43
新手上路 发帖 5 积分 14
能不能写一个启动电脑规定次数后执行的自动批处理命令
比如电脑记录启动五十次后自动就把硬盘格式化了,哈
第2楼 electronixtar 发表于 2006-05-11 22:57
铂金会员 发帖 2,672 积分 7,493
奇观~~联盟上总是有人问这类问题~~
第3楼 zwzhb 发表于 2006-05-12 12:59
新手上路 发帖 5 积分 14
啊,还有别人问么?
第4楼 bagpipe 发表于 2006-05-12 14:12
银牌会员 发帖 425 积分 1,144 来自 北京
呵呵,其实这个在2000/XP/2003系统上是很容易实现的,不过格式化我倒是没有想过,不过不管是重启还是打开机器规定多少次后执行什么命令是可以的
第5楼 bagpipe 发表于 2006-05-12 15:09
银牌会员 发帖 425 积分 1,144 来自 北京
@echo off
set i=1
if not exist c:\test.txt goto A

:C
if exist c:\test.txt goto D

:A
echo ^0>test.txt
goto C

:D
for /f %%i in (c:\test.txt) do set /a k=%%i+%i%
if "%k%"=="50" (goto B) else echo %k% 1>c:\test.txt&goto :eof

:B
echo SUCCESSFUL .... ....
这个是你想要执行的程序




粗略的写了一个,好像还能够更加简洁,不过这个不敢保证人家会不会进入系统后运行这个批处理,总之运行一次就少一次,呵呵,把这个放到启动里就可以了

测试环境 WINDOWS XP & WINDOWS 2000
第6楼 zwzhb 发表于 2006-05-12 15:44
新手上路 发帖 5 积分 14
哈,先谢谢了,明天就输入到批处理里用用,有问题再请教你
第7楼 zwzhb 发表于 2006-05-12 15:47
新手上路 发帖 5 积分 14
对了,在DOS6.22下用这个程序也应该是没问题的吧
第8楼 bagpipe 发表于 2006-05-12 16:09
银牌会员 发帖 425 积分 1,144 来自 北京
我说的已经很清楚了,测试环境我也写上了,DOS 6.22不可以............
第9楼 JonePeng 发表于 2006-05-12 16:22
金牌会员 发帖 1,883 积分 4,562 来自 广东广州
呵呵,貌似现在论坛里用 DOS 搞破坏的帖子越来越多了。
第10楼 zwzhb 发表于 2006-05-12 16:36
新手上路 发帖 5 积分 14
当然是为了限制使用人了,没事搞什么破坏!
第11楼 3742668 发表于 2006-05-12 19:23
荣誉版主 发帖 718 积分 2,013
哈哈,用格式化来限制使用的方法够牛,不过只要有兴趣,就从搞破坏开始又有何妨?

上面这个演示脚本运行在XP SP2下,如果想写个在DOS下运行的也不是没有可能,不过代码量相对大多了,所以略过,可以给点提示:
第12楼 willsort 发表于 2006-05-13 17:16
元老会员 发帖 1,512 积分 4,432
Re zwzhb:

其实根据启动次数来触发事件的批处理,已经接近于病毒的检测机制了。但实际上它实现起来非常简单,即使在DOS下也存在许多方案。所以,它是我在早期研究批处理伪病毒时最先完成的模块。

只是基于控制危险技术传播速度的目地,我只能提供大略的思路,不能贴出源码,事实上,我过去的源码也很难找到了。根据启动次数判断是否触发事件的前提是测得启动次数,如何获取并检测这个次数,可以有多种算法。

比如bagpipe和3742668兄所涉及的保存启动次数到变量并逐次递增的方案,在DOS下因为实现环境变量的加减比较复杂,所以可以将这种方法略作变形,将启动次数转变为临时文件的行数(可用find检测)或者总字节数(一般是次数*3)进行保存和检测。

或者也可以使用3742668兄第二方案中的压栈法将启动次数保存在文件名中,真正实现时可以不用逐行进行改名压栈,使用简单的命令行循环即可完成此项任务。

Re bagpipe:

感觉你的代码,为了照顾程序的结构上的顺序性,而影响了程序的简洁性和可阅读性。

比如 if not exist c:\test.txt goto A 和 if exist c:\test.txt goto D 便存在着代码冗余。而A、B、C、D四个标签段和相应的goto,也使程序的结构变得复杂。经过仔细考量,我认为这个标签可以全部略去,因为 c:\test.txt 的存在性判定可以由for语句稍加修改来一并完成,而其它跳转和分支也可以简并。

另外,兄使用变量 i 保存递增次数1,应该有特别的考量,恕我难以猜度。

最后,记得兄曾经贴过一张“风笛乐符字母”的签名图片,不知可否赠我一份聊作收藏?如若有意,请直接发往我的邮箱即可,不胜感谢!

Re 3742668:

如果将 set /a 一句直接写入临时批处理中保存,是否更简便些呢?比如:



To Wengier:

此主题可以转往“批处理室”继续讨论了,请略为代转。

[ Last edited by willsort on 2006-5-13 at 17:23 ]
第13楼 3742668 发表于 2006-05-13 19:24
荣誉版主 发帖 718 积分 2,013
Re willsort:
看了兄的回贴,感觉兄的风格还是偏向于DOS,而我的风格无疑是偏向CMD。
相信不少人都会有这样的想法:写批处理的时候尽量不要产生临时文件。尽管这其实并不是什么大的问题,和每次系统启动以及磁盘交换带来来比,可以忽略不计,但是还是有不少朋友喜欢用for来操作输出句柄。而我在写这个WINDOWS下的批处理前,自然就是迎合大众,以不产生临时文件为主。在本例中,不产生临时文件的方法其实有好几种,个人认为最简单,最方便的应该是利用NTFS格式的文件流了。所以一开始我是打算把启动次数写入到文件本身%0的某个非主流中的,但是写到一半想到并非人人都使用NTFS格式分区,为了"兼容",所以还是写到了一个文件中。
当然,如果为了不产生临时文件的话,方法其实还是蛮多的,可以用for,find以及事件日志命令等等。
回这个贴主要是想了解一下:
或者也可以使用3742668兄第二方案中的压栈法将启动次数保存在文件名中,真正实现时可以不用逐行进行改名压栈,使用简单的命令行循环即可完成此项任务。

不知能否给出DOS下命令行循环的思路,由于我这没有DOS环境,所以无法得知具体每个命令在DOS下各有哪些参数,所以对于DOS下的批处理从来只能提提思路,未敢妄自菲薄,闭门造车。麻烦兄能贴出需要的几条命令以及需要用到的参数,至于具体代码不如自己写来得深刻。
第14楼 tigerpower 发表于 2006-05-13 23:36
中级用户 发帖 99 积分 377
在dos批处理方面偶对willsort板主十分佩服,思考比较缜密,脚本通用性也比较好,还有些技巧偶是闻所未闻,让人大开眼界呀:)

[ Last edited by tigerpower on 2006-5-13 at 23:38 ]
第15楼 willsort 发表于 2006-05-14 19:44
元老会员 发帖 1,512 积分 4,432
Re 3742668:

启动次数的判定,无论采用何种算法,都需要设定一个“标记”,而且这个标记不会在关机后丢失,所以留给我们的选择似乎只余磁盘文件一途了。如果不想利用临时文件,系统文件或者批处理自身也许是个“标记”的藏身地,只不过存取起来就比较复杂了。

我所说的“命令行循环”,实际上就是指通过命令行参数将遍历对象传给自身,然后再使用shift+goto的loop循环,我在后期编写DOS下的递增或遍历型循环时,基本上多采用这种这种方式,因为它比for更加灵活。即使是与CMD的FOR相比,它也具有可以某一个时刻引用前后多个遍历对象的优点。在CMD下也可以实现这种方式,而且因为CALL的特性会更加简单一些。

DOS下的范例可以参考:

14512-将100个顺序文件改名
http://www.cn-dos.net/forum/viewthread.php?tid=14512

[ Last edited by willsort on 2006-5-14 at 20:24 ]
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023