标题: 能不能写一个启动电脑规定次数后执行的自动批处理命令
[打印本页]
作者: zwzhb
时间: 2006-5-11 17:43
标题: 能不能写一个启动电脑规定次数后执行的自动批处理命令
比如电脑记录启动五十次后自动就把硬盘格式化了,哈
作者: electronixtar
时间: 2006-5-11 22:57
奇观~~联盟上总是有人问这类问题~~
作者: zwzhb
时间: 2006-5-12 12:59
啊,还有别人问么?
作者: bagpipe
时间: 2006-5-12 14:12
呵呵,其实这个在2000/XP/2003系统上是很容易实现的,不过格式化我倒是没有想过,不过不管是重启还是打开机器规定多少次后执行什么命令是可以的
作者: bagpipe
时间: 2006-5-12 15:09
@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
作者: zwzhb
时间: 2006-5-12 15:44
哈,先谢谢了,明天就输入到批处理里用用,有问题再请教你
作者: zwzhb
时间: 2006-5-12 15:47
对了,在DOS6.22下用这个程序也应该是没问题的吧
作者: bagpipe
时间: 2006-5-12 16:09
我说的已经很清楚了,测试环境我也写上了,DOS 6.22不可以............
作者: JonePeng
时间: 2006-5-12 16:22
呵呵,貌似现在论坛里用 DOS 搞破坏的帖子越来越多了。
作者: zwzhb
时间: 2006-5-12 16:36
当然是为了限制使用人了,没事搞什么破坏!
作者: 3742668
时间: 2006-5-12 19:23
哈哈,用格式化来限制使用的方法够牛,不过只要有兴趣,就从搞破坏开始又有何妨?
@echo off
set /p num=<num.txt || echo 1 > num.txt
if %num% equ 50 goto something
set /a num = %num% + 1
echo %num% > num.txt
echo 这是第 %num% 次运行...
pause
goto :eof
:something
echo 50次到了。。。 & pause
上面这个演示脚本运行在XP SP2下,如果想写个在DOS下运行的也不是没有可能,不过代码量相对大多了,所以略过,可以给点提示:
@echo off
dir *.cxs
if errorlevel 1 echo ^&*HUIT^&%T^&%& > 1.cxs
if exist 50.cxs goto something
ren 48.cxs 49.cxs
ren 47.cxs 48.cxs
.
.
.
.
ren 1.cxs 2.cxs
goto :exit
:something
echo 已运行50次。
:exit
作者: willsort
时间: 2006-5-13 17:16
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 一句直接写入临时批处理中保存,是否更简便些呢?比如:
if exist _bootnum.cmd (call _bootnum.cmd) else set bootnum=1
echo set /a bootnum=%bootnum%+1>_bootnum.cmd
if bootnum equ 50 goto .....
To Wengier:
此主题可以转往“批处理室”继续讨论了,请略为代转。
[
Last edited by willsort on 2006-5-13 at 17:23 ]
作者: 3742668
时间: 2006-5-13 19:24
Re willsort:
看了兄的回贴,感觉兄的风格还是偏向于DOS,而我的风格无疑是偏向CMD。
相信不少人都会有这样的想法:写批处理的时候尽量不要产生临时文件。尽管这其实并不是什么大的问题,和每次系统启动以及磁盘交换带来来比,可以忽略不计,但是还是有不少朋友喜欢用for来操作输出句柄。而我在写这个WINDOWS下的批处理前,自然就是迎合大众,以不产生临时文件为主。在本例中,不产生临时文件的方法其实有好几种,个人认为最简单,最方便的应该是利用NTFS格式的文件流了。所以一开始我是打算把启动次数写入到文件本身%0的某个非主流中的,但是写到一半想到并非人人都使用NTFS格式分区,为了"兼容",所以还是写到了一个文件中。
当然,如果为了不产生临时文件的话,方法其实还是蛮多的,可以用for,find以及事件日志命令等等。
回这个贴主要是想了解一下:
Quote: |
或者也可以使用3742668兄第二方案中的压栈法将启动次数保存在文件名中,真正实现时可以不用逐行进行改名压栈,使用简单的命令行循环即可完成此项任务。 |
|
不知能否给出DOS下命令行循环的思路,由于我这没有DOS环境,所以无法得知具体每个命令在DOS下各有哪些参数,所以对于DOS下的批处理从来只能提提思路,未敢妄自菲薄,闭门造车。麻烦兄能贴出需要的几条命令以及需要用到的参数,至于具体代码不如自己写来得深刻。
作者: tigerpower
时间: 2006-5-13 23:36
在dos批处理方面偶对willsort板主十分佩服,思考比较缜密,脚本通用性也比较好,还有些技巧偶是闻所未闻,让人大开眼界呀:)
[
Last edited by tigerpower on 2006-5-13 at 23:38 ]
作者: willsort
时间: 2006-5-14 19:44
Re 3742668:
启动次数的判定,无论采用何种算法,都需要设定一个“标记”,而且这个标记不会在关机后丢失,所以留给我们的选择似乎只余磁盘文件一途了。如果不想利用临时文件,系统文件或者批处理自身也许是个“标记”的藏身地,只不过存取起来就比较复杂了。
我所说的“命令行循环”,实际上就是指通过命令行参数将遍历对象传给自身,然后再使用shift+goto的loop循环,我在后期编写DOS下的递增或遍历型循环时,基本上多采用这种这种方式,因为它比for更加灵活。即使是与CMD的FOR相比,它也具有可以某一个时刻引用前后多个遍历对象的优点。在CMD下也可以实现这种方式,而且因为CALL的特性会更加简单一些。
DOS下的范例可以参考:
[1]14512-将100个顺序文件改名
http://www.cn-dos.net/forum/viewthread.php?tid=14512
[
Last edited by willsort on 2006-5-14 at 20:24 ]
作者: htysm
时间: 2006-6-26 17:01
高手过招,一个字"爽".