对补丁文件进行对比后批量下载的问题?
以下代码有时下载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,"-",1)
If IniRead($PatchsList,"已安装补丁",$filekb,"") = "" Then
$Num +=1
$TempDown=InetGet($oLink.href,$PatchsDirectory & '\' & $file,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 <>0Then ExitLoop
IniWrite($PatchsList,"已安装补丁",$Var,"1");将枚举出的值逐行写入到指定的ini文件中
WEnd
EndFunc 回复 1# newuser
在线急盼中... 我这里根本打不开“http://10.64.240.23:801/clientfixpatchs_XP.htm”页面。 内网的,你必然打不开- - 回复 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
老大能给予帮助吗?谢谢!在先急盼... 回复 4# Ziya
不要意思没说清楚,我就是要局域网使用. 本帖最后由 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
MsgBox(4096, "", "关键字: " & $var[$i] & @CRLF & "值: " & $var[$i])
Next
EndIf
回复 3# 3mile
只 关注iniread()了,却忘记了inireadsection(),谢谢,解决了! 回复 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',$file)
;对获得的补丁下载地址进行拆分,1表示按照整个分割符"/"字符串来划分,而不是一个个字符来划分
$filekb=StringSplit($file,"-",1)
;MsgBox(0,'第'& $j &'个'&'$filekb',$filekb)
If IniRead($PatchsList,"已安装补丁",$filekb,"") = "" Then
$Num +=1; 本机未打补丁数
IniWrite($NewPatchsList,"未安装补丁",$j,$oLink.href)
EndIf
$j +=1
Next我将所获得的页面连接地址进行拆分取得其中补丁文件名称的KB 部分在与注册表中枚举出的KB部分比较,从而希望得出不同的KB 部分,但是我发现以上通过以上代码得出的KB部分有个别是计算机已经打过的补丁,那么以上代码就执行的不是很精确?
再请看以下代码:For $i = 1 To $FileList
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应该是很精确,但我看了半天正则表达式,还是一头雾水?能否用正则表达市纠正最上面的那段代码,如果可以的话,再就那个实例讲解一下,谢谢. 回复 9# newuser
afan老大,能否用正则表达式帮我改正上面的那段代码,在线等待... 本帖最后由 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
回复 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,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的时间吗? 回复 12# newuser
在线急盼... 本帖最后由 Duvet 于 2010-9-7 09:18 编辑
先頂個,等下回來看看 回复 13# newuser
我看了你到我发的那个帖子里提的问题了。。。
我具体看了一下。在我的机器上测试很常,请问下你是什么系统?
我在XP SP3下测试正常。。看了你的补丁文件是2003吧。。
我这里没有测试条件。还要安装2003 我机器里就一个WIN7 和一个XP
XP系统安装补丁的注册表路径是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix
不知道2003是否一样。。你在SERVER2003里找一下看有没有这个路径。
别的我帮不上你了
页:
[1]
2