找回密码
 加入
搜索
查看: 7889|回复: 16

关于自动更新正在运行的程序

  [复制链接]
发表于 2009-4-14 15:09:26 | 显示全部楼层 |阅读模式
本帖最后由 jakykuang 于 2009-5-8 13:33 编辑

想请教一下如何更新程序本身。
即正在运行的更新程序发现程序本身有新版本,应该怎样删除自己,然后下载新的更新程序,并改回原来的名称
发表于 2009-4-14 17:17:20 | 显示全部楼层
A.EXE,下载B.EXE,然后调用B.EXE,B.EXE具备关闭A.EXE进程并删除A.EXE的功能。这样应该就可以了。
发表于 2009-4-14 20:17:07 | 显示全部楼层
方法有很多,给你个参考

Func($newfile,$oldfile) ;$newfile欲更新的文件,含路径
        If FileExists($newfile) Then
                MsgBox(0, "注意:", "升级器检测到刚才的更新中含有新版本的升级器。" & @LF & "点击确定,将更新并重启本程序!", 10)
                FileDelete(@TempDir & '\rst.bat')
                FileWrite(@TempDir & '\rst.bat', 'ping 127.0.0.1 >nul' & @CRLF _
                                 & 'copy /y ' & FileGetShortName($newfile)&' ' & FileGetShortName($oldfile) & @CRLF _
                                 & FileGetShortName($oldfile) & @CRLF _
                                 & 'echo by pcbar')
                Run(@TempDir & '\rst.bat', "", @SW_HIDE)
        EndIf
exit
EndFunc
发表于 2009-4-15 08:40:10 | 显示全部楼层
昨天刚好用到,就在以前的_DeleteSelf基础上改写一个。

;===============================================================================
; 说明:   退出后更新脚本自身
; 语法:   _UpdateSelf($sFile[, $iDelay = 1[, $iResume = 0[, $sParm = ""]]])
; 参数:   $sFile - 源更新文件
;         $iDelay - [可选] 监视退出的间隔时间, 单位为秒
;         $iResume - [可选] 更新后重新运行。0 - 不运行, 非0 - 重新运行
;         $sParm - [可选] 重新运行命令行参数
; 需要:   无
; 返回:   成功 - 1
;         失败 - 0, 并设置 @error 到 1
; 备注:   无
;===============================================================================
Func _UpdateSelf($sFile, $iDelay = 1, $iResume = 0, $sParm = "")
        Local $CmdFile, $CmdCont
        If NOT FileExists($sFile) Then Return SetError(1, 0, 0)
        $iDelay = Int($iDelay)
        If $iDelay < 1 Then $iDelay = 1

        $CmdCont = 'attrib -r -s -h "' & @ScriptFullPath & '"' & @CRLF _
                & ':loop' & @CRLF _
                & 'ping -n ' & $iDelay + 1 & ' 127.0.0.1 > nul' & @CRLF _
                & 'del "' & @ScriptFullPath & '"' & @CRLF _
                & 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _
                & 'move /y "' & $sFile & '" "' & @ScriptFullPath & '"' & @CRLF
        If $iResume Then
                If $sParm = "" Then
                        $CmdCont &= '"' & @ScriptFullPath & '"' & @CRLF
                Else
                        $CmdCont &= '"' & @ScriptFullPath & '" ' & $sParm & @CRLF
                EndIf
        EndIf
        $CmdCont &= 'del %0' & @CRLF

        $CmdFile = _TempFile(@TempDir, "~UPD", ".bat", 4)
        FileWrite($CmdFile, $CmdCont)
        Run($CmdFile, @TempDir, @SW_HIDE)

        Return 1
EndFunc   ;==>_UpdateSelf
 楼主| 发表于 2009-4-17 00:31:16 | 显示全部楼层
我也想到skyfree的方法,正在使用,谢谢各位支持
发表于 2012-4-26 06:02:23 | 显示全部楼层
回复 4# sensel
学习了,正需要这个!
发表于 2012-4-26 08:17:01 | 显示全部楼层
延时更新,有现成的UDF哈
发表于 2012-4-28 10:10:28 | 显示全部楼层
回复 7# menfan1
想知道是哪个UDF?
发表于 2012-5-16 22:42:01 | 显示全部楼层
回复 4# sensel
为什么有的时候会失灵呢?真是郁闷啊!
发表于 2012-6-14 13:14:57 | 显示全部楼层
这个得回看哈
发表于 2012-10-29 09:27:00 | 显示全部楼层
不错,不错
发表于 2013-8-22 01:07:56 | 显示全部楼层
好像AU3教程里有一例是讲删除C:\Drivers 这个目录,保留摄像头驱动。你可以作参考。代码如下:

Opt ("mustdeclareVars",1)
_main()
Exit
Func _main()
        Local $driversDir=EnvGet ("systemDrive")&"\drivers"
        Local $tempDir=EnvGet ("windir")&"\temp"
        Local $cameraDir=$driversDir&"\camera"
        If FileExists ($driversDir) Then
                Local $r=MsgBox (3+32,"3-3", _
                "发现"&$driversDir&",是否全部删除?"&@crlf& _
                "单击“是”,全部删除:"&@crlf& _
                "单击“否“,保留摄像头驱动;"&@crlf& _
                "单击“取消”,不删除")
                If $r=6 then
                        DirMove($driversDir,1)
                        MsgBox (0,"","驱动已全部删除!")
        ElseIf $r = 7 Then
                        DirMove($DriversDir & "\Camera", _
                                        $TempDir & "\_Camera", 1)
                        DirRemove($DriversDir, 1)
                        DirCreate($DriversDir)
                        DirMove($TempDir & "\_Camera", _
                                        $DriversDir & "\Camera", 1)
                        MsgBox(0 + 64, "3-3", _
                                        "除摄像头以外的驱动已删除!")
                ElseIf $r = 2 Then
                        MsgBox(0 + 64, "3-3", "全部驱动已保留")
                EndIf
        Else
                MsgBox(0,"","未找到"&$driversDir)
        EndIf

EndFunc
发表于 2013-8-22 01:14:21 | 显示全部楼层
学习中。。。。
发表于 2014-12-22 14:48:04 | 显示全部楼层
哈哈,学到了些东西!谢谢楼主
发表于 2014-12-31 12:01:11 | 显示全部楼层
我是来学习的,真心觉你写得不错








北京大学留学     北京大学留学预科   美国留学预科
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-25 14:25 , Processed in 0.077352 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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