vuivui 发表于 2012-12-11 08:55:41

au3删除自身的探讨

本帖最后由 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一行命令也就可以解决,如何实现呢?请大家动下脑筋再看隐藏内容:

**** Hidden Message *****


终极大法:

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

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

**** Hidden Message *****

menfan1 发表于 2012-12-11 09:23:28

做个板凳,这个是老问题哈,搜索一下很多很多。。

kk_lee69 发表于 2012-12-11 09:56:19

學習參考看看

淡定开源 发表于 2012-12-11 10:08:00

回复看看。。。。

MicroBlue 发表于 2012-12-11 12:22:53

把一个问题分析的很透彻是一件非常有意义的事情,感谢楼主。

轩辕小妖 发表于 2012-12-11 14:01:30

学习下,看看有多高明,其实前面的几种都可以了,ping延时一下,然后删除~~

ljxu 发表于 2012-12-11 17:58:33

學習參考看看

ifana 发表于 2012-12-11 19:56:33

学习下,谢谢分享

虫子樱桃 发表于 2012-12-11 20:53:07

回复 1# vuivui


    谢谢兄台,学习啦

删删 发表于 2012-12-12 19:36:53

学习 ,学习                  .

chenronting 发表于 2012-12-12 23:02:01

我过来学习一下,看除CMD删除外还有什么办法?!

chenronting 发表于 2012-12-12 23:02:14

我过来学习一下,看除CMD删除外还有什么办法?!

chenronting 发表于 2012-12-12 23:05:03

还是CMD。老办法了,总结:还是虫子的实用。

vuivui 发表于 2012-12-13 08:40:12

还是CMD。老办法了,总结:还是虫子的实用。
chenronting 发表于 2012-12-12 23:05 http://www.autoitx.com/images/common/back.gif

是老办法了,vb也同样调用cmd删除自身,因为这样最简单。但cmd学问大着呢,难道我们一用到au3就说是老办法了,就不去研究探讨了?

fangbaiyu 发表于 2012-12-13 13:13:34

呵呵LZ想法还挺全的
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: au3删除自身的探讨