找回密码
 加入
搜索
查看: 198752|回复: 474

[原创] au3删除自身的探讨

 火... [复制链接]
发表于 2012-12-11 08:55:41 | 显示全部楼层 |阅读模式
本帖最后由 vuivui 于 2014-4-25 12:24 编辑

au3删除自身的探讨

看了虫子樱桃兄写的“au3自删除的归纳”一帖,研究了一下发现里面有很多玄妙,里面涉及了cmd、进程、线程、编译等知识,下面讲一下我的见解。

(一)未编译脚本文件运行

脚本运行后被读入内存,脚本文件已不影响运行,可以任意地移动、改名和删除。
把以下内容保存为“1.au3”,先运行,然后移动、改名或删除它:
SplashTextOn("删除自身演示", "请把我的脚本文件移动、改名或删除", 200, 150, -1, -1, 4, "楷体_GB2312", 18)
While FileExists(@ScriptFullPath)
WEnd
For $i = 6 To 1 Step -1
        ControlSetText("删除自身演示", "", "Static1", "^_^ 验证成功" & @LF & @LF & "还有 " & $i&" 秒退出")
        Sleep(1000)
Next
所以,可用autoit自带FileDelete命令删除自身,并且此命令可放在任何位置,请演示以下脚本:
FileDelete(@ScriptFullPath)
If FileExists(@ScriptFullPath) Then
        $f = @ScriptName & "还好好的"
Else
        $f = @ScriptName & "已删除"
EndIf
MsgBox(1, "删除自身演示", $f)
(二)编译成exe文件运行

编译成exe文件后运行的话,因为文件本身在进程内,文件是无法删除的。如运行上面的第二个例子结果应该是“还好好的”。

所以编译成exe后,删除自身的话,只能在退出前启动其他进程,等原进程退出后再删除其文件。一般用cmd的del命令来删除的:
run('cmd /c ping 127.0.0.1 -n 3 & del /q/f/a "'& @ScriptFullPath & '"','',@SW_HIDE)
等待时间是2秒(-n 3是2个间隔),del应加上/a参数,确保删除带隐藏等属性的文件,此语句须放在代码结束位置或exit前。

但是这个命令有不完美之处,就是无法确保文件的删除。采取的办法是等了2秒进程还没退出,就强行终止进程,因为au3是单线程,运行到exit说明其他任务已结束,强行终止进程是没问题的,可以采取以下的命令实现:
run('cmd /c ping 127.0.0.1 -n 2 & taskkill /f /pid "'& @AutoItPID & '"& del /q/f/a "'& @ScriptFullPath & '"','',@SW_HIDE)
这个命令是确保了自身文件的删除,但exit语句不能执行其他的命令,且退出慢的话就强行结束终究不自然。写个bat文件执行后还要删除bat文件,麻烦不说而且不直观很难看懂,不推荐。

其实也是cmd一行命令也就可以解决,如何实现呢?请大家动下脑筋再看隐藏内容:

游客,如果您要查看本帖隐藏内容请回复



终极大法:

cmd延时存在很大的缺陷,不合适放在脚本前端。如果放在脚本退出点,有的脚本退出点很多,每个退出点都放一条删除命令很麻烦,更何况一些非正常原因终止,尚未执行删除命令进程就结束了,达不到删除自身的目的。

下面这个办法可以完美解决这个问题,同样请大家先思考一下再看答案,提示一下延时利用au3实现,前提还是不通过创建文件来实现。

游客,如果您要查看本帖隐藏内容请回复
发表于 2012-12-11 09:23:28 | 显示全部楼层
做个板凳,这个是老问题哈,搜索一下很多很多。。
发表于 2012-12-11 09:56:19 | 显示全部楼层
學習參考看看
发表于 2012-12-11 10:08:00 | 显示全部楼层
回复看看。。。。
发表于 2012-12-11 12:22:53 | 显示全部楼层
把一个问题分析的很透彻是一件非常有意义的事情,感谢楼主。
发表于 2012-12-11 14:01:30 | 显示全部楼层
学习下,看看有多高明,其实前面的几种都可以了,ping延时一下,然后删除~~
发表于 2012-12-11 17:58:33 | 显示全部楼层
學習參考看看
发表于 2012-12-11 19:56:33 | 显示全部楼层
学习下,谢谢分享
发表于 2012-12-11 20:53:07 | 显示全部楼层
回复 1# vuivui


    谢谢兄台,学习啦
发表于 2012-12-12 19:36:53 | 显示全部楼层
学习 ,学习                    .
发表于 2012-12-12 23:02:01 | 显示全部楼层
我过来学习一下,看除CMD删除外还有什么办法?!
发表于 2012-12-12 23:02:14 | 显示全部楼层
我过来学习一下,看除CMD删除外还有什么办法?!
发表于 2012-12-12 23:05:03 | 显示全部楼层
还是CMD。老办法了,总结:还是虫子的实用。
 楼主| 发表于 2012-12-13 08:40:12 | 显示全部楼层
还是CMD。老办法了,总结:还是虫子的实用。
chenronting 发表于 2012-12-12 23:05


是老办法了,vb也同样调用cmd删除自身,因为这样最简单。但cmd学问大着呢,难道我们一用到au3就说是老办法了,就不去研究探讨了?
发表于 2012-12-13 13:13:34 | 显示全部楼层
呵呵  LZ想法还挺全的
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-4 01:30 , Processed in 0.075998 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表