关于自动更新正在运行的程序
本帖最后由 jakykuang 于 2009-5-8 13:33 编辑想请教一下如何更新程序本身。
即正在运行的更新程序发现程序本身有新版本,应该怎样删除自己,然后下载新的更新程序,并改回原来的名称 A.EXE,下载B.EXE,然后调用B.EXE,B.EXE具备关闭A.EXE进程并删除A.EXE的功能。这样应该就可以了。 方法有很多,给你个参考
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 昨天刚好用到,就在以前的_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
我也想到skyfree的方法,正在使用,谢谢各位支持:face (19): 回复 4# sensel
学习了,正需要这个! 延时更新,有现成的UDF哈 回复 7# menfan1
想知道是哪个UDF? 回复 4# sensel
为什么有的时候会失灵呢?真是郁闷啊! 这个得回看哈 不错,不错{:face (249):} 好像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 学习中。。。。 哈哈,学到了些东西!谢谢楼主 我是来学习的,真心觉你写得不错
北京大学留学 北京大学留学预科 美国留学预科
页:
[1]
2