找回密码
 加入
搜索
查看: 10116|回复: 19

[系统综合] 对补丁文件进行对比后批量下载的问题?

  [复制链接]
发表于 2010-9-3 09:53:35 | 显示全部楼层 |阅读模式
以下代码有时下载2个,有时根本不下载假死了,怎么回事?
#include <GUIConstantsEx.au3>
#include <IE.au3>
;----------------------------------------------进行程序执行前的一些必要的变量定义和条件判断
Dim  $Num=0;下载补丁数初始为0
Dim  $i;枚举注册表时用
Dim  $TempDown;接收下载补丁文件
Dim  $PatchsDirectory=@ScriptDir & '\Update',$PatchsList=@ScriptDir & '\PatchsList.ini'
;定义下载补丁的存放目录和存储已打补丁KB名称部分的INI文件
Dim  $FixedPatchsRegPath="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix"
;定义枚举注册表中已打补丁路径
Dim $oLinks,$iNumLinks,$oIE
If FileExists($PatchsDirectory) Then
        DirRemove($PatchsDirectory,1)
Else
        DirCreate($PatchsDirectory)
EndIf

If @OSVersion="WIN_XP"  Then
        $oIE=_IECreate("http://10.64.240.23:801/clientfixpatchs_XP.htm");应该是创建1个指定页面的浏览器窗口
ElseIf  @OSVersion="WIN_2003" Then
        $oIE = _IECreate ("http://10.64.240.23:801/clientfixpatchs_2003.htm")
Else
        MsgBox(0,'','抱歉,目前该工具仅支持WinXP和WinServer2003系统,' & @CRLF & _
                 '该工具正在退出...')
EndIf
$oLinks = _IELinkGetCollection ($oIE);收集这个页面的所有连接
$iNumLinks = @extended;扩展的函数返回值,使用于一些特定函数,如Stringsplit()
;实际$iNumLinks=@extended也是指定页面上的所有连接总数
;----------------------------------------------------------------------------- 
_EnumRegFixedPatchs()

For $oLink In $oLinks
    ;MsgBox(0, "Link Info", $oLink.href)
        ;地址样例:http://100.100.100/patchs/10-034/WindowsServer2003-KB980195-x86-CHS.exe
        $file=StringSplit($oLink.href,"/",1)
        ;对获得的补丁下载地址进行拆分,1表示按照整个分割符"/"字符串来划分,而不是一个个字符来划分
        $filekb=StringSplit($file[6],"-",1)
        If IniRead($PatchsList,"已安装补丁",$filekb[2],"") = "" Then 
                $Num +=1
                $TempDown=InetGet($oLink.href,$PatchsDirectory & '\' & $file[6],1,1)
        EndIf
        ;第一个1是强制从远程服务器下载文件,第二个1是进行后台下载并继续执行下面的语句,0表示下载完毕后再执行后面的语句
        Do
                Sleep(250)
        Until InetGetInfo($TempDown,2) ; 检查下载是否完成.没有Do...Until循环,就无法实现批量下载,即仅下载1个文件
        InetClose($TempDown) ;关闭句柄,释放资源
Next
ToolTip(@CR & "在" & $PatchsDirectory & '\' & @CR &@CR & "目 录 下 总 共 有" & $Num& "个 软 件 下 载 完 毕 !  " & @CR, @DesktopWidth - 620, @DesktopHeight - 360)
Func _EnumRegFixedPatchs()
        While 1
        $i +=1
        $Var=RegEnumKey($FixedPatchsRegPath,$i)
        If @error <>0  Then ExitLoop
        IniWrite($PatchsList,"已安装补丁",$Var,"1");将枚举出的值逐行写入到指定的ini文件中        
        WEnd
EndFunc
 楼主| 发表于 2010-9-3 09:55:37 | 显示全部楼层
回复 1# newuser

在线急盼中...
发表于 2010-9-3 10:07:24 | 显示全部楼层
我这里根本打不开“http://10.64.240.23:801/clientfixpatchs_XP.htm”页面。
发表于 2010-9-3 10:20:53 | 显示全部楼层
内网的,你必然打不开- -
 楼主| 发表于 2010-9-3 10:55:29 | 显示全部楼层
回复 3# 3mile

不好意思,我的是内网的,我现在换了个思路,不直接进行补丁KB部分的斟选在批量下载,那样感觉比我直接全部补丁下载还慢,我先获取计算机上还没打的补丁连接地址,现在已经成功了 ,可是我有遇到一个问题,就是如何一行行读取INI文件中的关键字的值,INI内容如下:
[未安装补丁]
1=http://10.64.240.23:801/patchs/10-060/NDP20SP1-KB983582-x86.exe
2=http://10.64.240.23:801/patchs/10-060/NDP20SP2-KB983583-x86.exe
27=http://10.64.240.23:801/patchs/10-022/WindowsServer2003-KB981349-x86-CHS.exe
55=http://10.64.240.23:801/patchs/09-054/WindowsServer2003-KB974455-x86-CHS.exe
56=http://10.64.240.23:801/patchs/09-053/WindowsServer2003-KB975254-x86-CHS.exe
58=http://10.64.240.23:801/patchs/09-051/WindowsMedia9-KB969878-x86-CHS.exe
61=http://10.64.240.23:801/patchs/09-044/WindowsServer2003-KB956744-x86-CHS.exe
66=http://10.64.240.23:801/patchs/09-039/WindowsServer2003-KB969883-x86-CHS.exe
72=http://10.64.240.23:801/patchs/09-034/WindowsServer2003-KB972260-x86-CHS.exe
73=http://10.64.240.23:801/patchs/09-032/WindowsServer2003-KB973346-x86-CHS.exe
77=http://10.64.240.23:801/patchs/09-025/WindowsServer2003-KB968537-x86-CHS.exe
79=http://10.64.240.23:801/patchs/09-020/WindowsServer2003-KB970483-x86-CHS.exe
80=http://10.64.240.23:801/patchs/09-019/WindowsServer2003-KB969897-x86-CHS.exe
81=http://10.64.240.23:801/patchs/09-018/WindowsServer2003-KB970437-x86-CHS.exe
83=http://10.64.240.23:801/patchs/09-014/WindowsServer2003-KB963027-x86-CHS.exe
86=http://10.64.240.23:801/patchs/09-011/WindowsServer2003-KB961373-x86-CHS.exe
89=http://10.64.240.23:801/patchs/09-006/WindowsServer2003-KB958690-x86-CHS.exe
91=http://10.64.240.23:801/patchs/08-078/WindowsServer2003-KB960714-x86-CHS.exe
95=http://10.64.240.23:801/patchs/08-052/WindowsServer2003-KB938464-v2-x86-CHS.exe
99=http://10.64.240.23:801/patchs/08-001/WindowsServer2003-KB941644-x86-CHS.exe
老大能给予帮助吗?谢谢!在先急盼...
 楼主| 发表于 2010-9-3 10:56:22 | 显示全部楼层
回复 4# Ziya

不要意思没说清楚,我就是要局域网使用.
发表于 2010-9-3 10:58:38 | 显示全部楼层
本帖最后由 3mile 于 2010-9-3 11:01 编辑

回复 5# newuser
IniReadSection读取某个节中的所有关键字或值到数组,建循环依次下载安装。
$var = IniReadSection("myfile.ini", "未安装补丁")
If @error Then 
        MsgBox(4096, "", "错误, 读取INI文件失败.")
Else
        For $i = 1 To $var[0][0]
                MsgBox(4096, "", "关键字: " & $var[$i][0] & @CRLF & "值: " & $var[$i][1])
        Next
EndIf

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-9-3 11:00:02 | 显示全部楼层
回复 3# 3mile
只 关注iniread()了,却忘记了inireadsection(),谢谢,解决了!
 楼主| 发表于 2010-9-6 14:56:13 | 显示全部楼层
回复 7# 3mile
又发现个新问题,请看以下代码:
For $oLink In $oLinks
    ;MsgBox(0, "Link Info", $oLink.href)
        ;地址样例:http://100.100.100/patchs/10-034/WindowsServer2003-KB980195-x86-CHS.exe        
        $file=StringSplit($oLink.href,"/",1)
        ;MsgBox(0,'第'& $j &'个'&'$file[6]',$file[6])
        ;对获得的补丁下载地址进行拆分,1表示按照整个分割符"/"字符串来划分,而不是一个个字符来划分
        $filekb=StringSplit($file[6],"-",1)
        ;MsgBox(0,'第'& $j &'个'&'$filekb[2]',$filekb[2])
        If IniRead($PatchsList,"已安装补丁",$filekb[2],"") = "" Then 
                $Num +=1; 本机未打补丁数
                IniWrite($NewPatchsList,"未安装补丁",$j,$oLink.href)
        EndIf
        $j +=1
Next
我将所获得的页面连接地址进行拆分取得其中补丁文件名称的KB 部分在与注册表中枚举出的KB部分比较,从而希望得出不同的KB 部分,但是我发现以上通过以上代码得出的KB部分有个别是计算机已经打过的补丁,那么以上代码就执行的不是很精确?
再请看以下代码:
For $i = 1 To $FileList[0]
                GUICtrlCreateListViewItem($x & "|" & $FileList[$i] & "|等待安装", $ListView1);将读取到得数据写入到$ListView1
                $fen = StringRegExpReplace($FileList[$i], '.*?(KB\d+)[^\d]*?.*', '$1');afan帮助写得这句话。不明白什么意思
                $o = 1;表示从什么位置开始枚举已经打过的补丁数 
                While 1;开始判断是否已经安装过此补丁。注册表路径不知道对不对。不对的改一下就可以
                        $var = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix", $o)
                        If @error <> 0 Then ExitLoop;枚局失败退出循环
                        $string = StringRegExpReplace($var, '.*?(KB\d+)[^\d]*?.*', '$1');afan帮助写得这句话。不明白什么意思
                        If $string = $fen Then
                                _GUICtrlListView_SetItemText($ListView1, $x - 1, '本机已经安装', 2);如果注册表中存在此补丁的信息就修改显示的信息
                                ExitLoop
                        Else
                        EndIf
                        $o += 1
                WEnd
                $x += 1
        Next
它使用了正则表达式,提取的不同的KB应该是很精确,但我看了半天正则表达式,还是一头雾水?能否用正则表达市纠正最上面的那段代码,如果可以的话,再就那个实例讲解一下,谢谢.
 楼主| 发表于 2010-9-6 15:59:47 | 显示全部楼层
回复 9# newuser
afan老大,能否用正则表达式帮我改正上面的那段代码,在线等待...
发表于 2010-9-6 16:22:27 | 显示全部楼层
本帖最后由 afan 于 2010-9-6 16:25 编辑


For $oLink In $oLinks
        $filekb = StringRegExpReplace($oLink.href, '.*?(KB\d+)[^\d]*?.*', '$1') 
        If IniRead($PatchsList,"已安装补丁",$filekb,"") = "" Then 
                $Num +=1; 本机未打补丁数
                IniWrite($NewPatchsList,"未安装补丁",$j,$oLink.href)
        EndIf
        $j +=1
Next
 楼主| 发表于 2010-9-6 17:08:42 | 显示全部楼层
回复 11# afan
不行啊?已经打过的补丁还是下载了!

另外,请教老大,延续1楼的问题:我先批量下载了指定页面的补丁都文件夹Update.如果我单用它,没问题,能正常下载,但现在我在他之后增加 _FileListToArray("\Update","*.exe",1),有时就会出现下载还没完成就_FileListToArray,结果后者肯定失败!
难道这段代码:
Func _DownPatchsFromWeb()
        For $oLink In $oLinks
    ;MsgBox(0, "Link Info", $oLink.href)
        $file=StringSplit($oLink.href,"/",1);对获得的补丁下载地址进行拆分
        ;Local $TempDown=InetGet($oLink.href,@ScriptDir & "\Update" & $i & ".exe",1,1)
        Local $TempDown=InetGet($oLink.href,$PatchsFileDownDirctory & "" & $file[6],1,1)
        ;第一个1是强制从远程服务器下载文件,第二个1是进行后台下载并继续执行下面的语句,0表示下载完毕后再执行后面的语句
        Do
                Sleep(150)
        Until InetGetInfo($TempDown,2) ; 检查下载是否完成.没有Do...Until循环,就无法实现批量下载,即仅下载1个文件
        InetClose($TempDown) ;关闭句柄,释放资源
        ;ToolTip(@CR & "在" & $PatchsFileDownDirctory & @CR &@CR & "目 录 下 总 共 有" & $iNumLinks & "个 系 统 补 丁 下  载 完 毕 !  " & @CR, @DesktopWidth - 620, @DesktopHeight - 360)
     Next
 EndFunc
没有保证批量下载先完成吗?其实我已经调整了Sleep(500),我该如何先确保完成批量下载后再有效的进行_filetoarray()呢?难道一直要不断的增加sleep的时间吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2010-9-7 07:43:01 | 显示全部楼层
回复 12# newuser
在线急盼...
发表于 2010-9-7 08:56:39 | 显示全部楼层
本帖最后由 Duvet 于 2010-9-7 09:18 编辑

先頂個,等下回來看看
发表于 2010-9-7 11:57:31 | 显示全部楼层
回复 13# newuser


    我看了你到我发的那个帖子里提的问题了。。。
我具体看了一下。在我的机器上测试很常,请问下你是什么系统?
我在XP SP3下测试正常。。看了你的补丁文件是2003吧。。

我这里没有测试条件。还要安装2003 我机器里就一个WIN7 和一个XP
XP系统安装补丁的注册表路径是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix
不知道2003是否一样。。你在SERVER2003里找一下看有没有这个路径。

别的我帮不上你了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-21 22:32 , Processed in 0.102916 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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