风一样的男孩 发表于 2008-9-9 06:57:56

Au3编写的软件自动更新工具

$g_szVersion = \"YMTOOL_UPDATE\"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
#include <GUIConstants.au3>
$var = Ping(\"www.163.com\",500) ;;;检查网络是否通畅
If $var Then; also possible: If @error = 0 Then
TrayTip(\"L4EVER.cn软件更新检查示例\", \"正在检查程序更新....\",2)
Else
$exit = MsgBox(52, \"警告\", \"网络连接错误,无法检查更新.\"&@CRLF&\"是否打开本地程序?\")
IF $EXIT = 7 THEN
exit
ELSE
if FileExists(\"D:\Program Files\XXXXXX\XXXX.exe\") then ;;;需要更新的程序路径
run(\"D:\Program Files\XXXXXX\XXXX.exe\")
else
MsgBox(16, \"警告\", \"本地文件不存在,\"&@CRLF&\"请等网络连接正常后再启动本程序!\")
EndIf
EndIf
exit
EndIf

Dim $under,$upon,$per,$res,$filesize,$Inetget,$setup;定义变量

GUICREATE (\"L4EVER.cn软件更新检查示例\",280,80)
$Filepath1 = (\"http://L4EVER.cn/labs/XXXX.exe\") ;;;远程服务器上的文件地址
$Filepath2 = (\"D:\Program Files\XXXXXX\XXXX.exe\") ;;;需要更新的程序路径

$f1 = InetGetSize ($Filepath1) ;;;获取远程文件大小
If @error Then
$exit = MsgBox(52, \"警告\", \"获取服务器文件信息错误,\"&@CRLF&\"可能是您的网络出现故障,\"&@CRLF&\"或者服务器出现故障,\"&@CRLF&\"是否打开本地程序?\")
IF $EXIT = 7 THEN
exit
ELSE
if FileExists($Filepath2) then
run($Filepath2)
else
MsgBox(16, \"警告\", \"本地文件不存在,\"&@CRLF&\"请稍候再尝试启动本程序!\")
EndIf
EndIf
EndIf
$f2 = FileGetSize(\"XXXX.exe\");;;获取本地文件大小,本程序必须可XXXX.exe放到同一目录,因为FileGetSize好像无法获取其他目录的文件大小.

If $f1 = $F2 Then
run(\"XXXX.exe\")
exit
ElseIf $f1 <> $F2 then
MsgBox(48, \"提示\", \"L4EVER.cn软件更新检查示例 已更新,\"&@CRLF&\"请点击[开始更新]按钮下载更新!\")
EndIf


GUICtrlCreateLabel (\"更新进度:\",10,20)
$progres = GuiCtrlCreateProgress (70,15,200,20)
$ENSURE = GUICtrlCreateBUTTON (\"开始更新\",70,50,60,20)

$QUIT = GUICtrlCreateBUTTON (\"退出程序\",150,50,60,20)
GuiSetState()


WHILE 1
;;;;;;;;;;;;;;;;;;;;;如果点右上角\"关闭\"按钮或\"退出\"按钮则询用用户确定退出
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE OR $msg = $QUIT Then
$exit = MsgBox (36,\"提示\",\"XXXXXXXXXX不会运行,\"&@CRLF&\"是否退出更新程序?\")
IF $EXIT = 7 THEN
ContinueLoop
ELSE
EXIT
ENDIF
ENDIF

If $msg = $ENSURE THEN NAME() ;;;如果点确定按钮则转到NAME()
WEND

Func NAME()

$Inetget = StringStripWS ( ($Filepath1),4) ;;这两句是去掉字符串两边的空格,但实验发现处理后的字符串前后还会各有
$INETGET2 = StringStripWS ( ($Filepath2),4) ;;一个空格,不知为什么,所以下面我用了一句IF $Inetget2 = \" \" or \"\" then

;;;;;;;;下面这段意思是:如果本地路径为空格则从远程路径中取出文件名存入$setup

IF $Inetget2 = \" \" or $Inetget2 = \"\" then ;如果\"本地文件路径\"为空格或为空,那么从远程路径里面取文件名
$setup = \"\"
$InetgetCUT = $Inetget
while 1 ;;;这个循环就是从远程路径里面取文件名了,从最后一个字符一直向前循环,遇到\"/\"字符时跳出循环
$str = StringRight ($InetgetCUT,1)
Select
Case $str = \"\"
RETURN
Case $str = \"/\"
EXITLOOP
Case Else
$InetgetCUT = StringTrimRight ($InetgetCUT,1)
$setup = $str & $setup
EndSelect
wend
ELSE
$SETUP = $Inetget2 ;;否则把\"本地文件路径\"中的内容放入$SETUP
ENDIF

if $setup = \"\" or $setup = \" \" then return ;如果$setup为空格或空串则返回

$under = InetGetSize ($Inetget)
InetGet ($Inetget,$setup,1,1)

While @InetGetActive ;判定循环条件
TrayTip(\"正在下载更新中\", \"已下载 \" & @InetGetBytesRead/1024/1024 &\" M\",1);监视正在下载的文件大小
$upon = @InetGetBytesRead ;获取已下载大小
$per = $upon/$under*100 ;计算比值
$res = StringLeft ($per,3) ;计算百分值
GuiCtrlSetData($progres , $res) ;下载进度的值
;;;;;;;;;;;;;;;;;;;;; 如果点右上角关闭按钮或退出按钮则询用用户
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE OR $msg = $QUIT Then
$exit = MsgBox (36,\"警告\",\"更新过程中退出会造成程序无法运行,\"&@CRLF&\"你确定退出本程序?\")
IF $EXIT = 7 THEN
ContinueLoop
ELSE
EXIT
ENDIF
ENDIF
WEnd
GuiCtrlSetData($progres , 0)
if FileGetSize ($setup) = 0 then
TrayTip(\"下载失败\",\"文件\" & $setup & \"下载失败\",10)
else
IF $under = FileGetSize ($setup) Then TrayTip(\"更新完成\", \"下载文件\" & $setup & \"大小为\" & $under/1024/1024 &\" M\",10) ;;这句是右下角的提示
run(\"XXXX.exe\") ;;;运行已经更新的程序
exit
ENDIF
RETURN
ENDFUNC

lystar 发表于 2008-10-22 13:39:38

思想是生命!也是灵魂啊!学习方法!

hx89021691 发表于 2009-4-29 00:26:48

强悍,支持下。学习

w86557215 发表于 2009-6-6 17:52:51

论坛启用新域名www.lansedongli.com

香烟 发表于 2009-6-8 08:32:13

谢谢呵呵

xwyd 发表于 2009-6-8 15:45:46

学习一下

sunhai1979 发表于 2009-6-9 15:23:14

学习一下,谢谢分享
页: [1]
查看完整版本: Au3编写的软件自动更新工具