|
楼主 |
发表于 2010-8-12 08:06:08
|
显示全部楼层
回复 7# xsjtxy
不好意思,昨天光缆断了,不过还是有个问题,明明打补丁之前,机器有已打补丁100,使用如下代码又新打了几个,可是再次使用脚本,机器已打补丁还是100?那新打的补丁到哪里去了呢?重新启动依然?!!!弄了大半天也不知道问题在哪?
另外请教,360威势在机器上打补丁的目录在哪里?谢谢!#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_UseUpx=n
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <IE.au3>
#include <ButtonConstants.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <file.au3>
#include <array.au3>
Opt("GuiOnEventMode",1)
DirCreate(@ScriptDir & "\Update")
$PatchsFileDownDirctory=@ScriptDir & "\Update"
Dim $FixedPatchsRegPath="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix"
Dim $FixedPatchsListPath=@ScriptDir & "\FixedPatchsList.ini"
Dim $i
_EnumRegFixedPatchs();枚举计算机已经安装的补丁数
;创建打补丁主程序界面
$Form1 = GUICreate("局域网补丁更新工具", 401, 301, 373, 184)
$Group1 = GUICtrlCreateGroup("", 5, 60, 290, 230)
$Label1 = GUICtrlCreateLabel("安装进度:", 16, 234, 64, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Progress1 = GUICtrlCreateProgress(80, 230, 209, 20);创建1个进度条显示补丁安装过程
$Label2=GUICtrlCreateLabel("补丁状态",15,265,65,15)
GUICtrlSetColor(-1,0x008000)
GUICtrlSetFont(-1,8.5,400,0,"Arial")
$message="本机已存在的安全补丁:" & $i-1 & "个"
$Label3=GUICtrlCreateLabel($message,80,265,240,15);用于显示补丁不同安装时期的信息状态
$ListView1 = GUICtrlCreateListView("计数|安全标示名称|安装状态", 5, 65, 290, 155)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("安装补丁", 312, 96, 73, 33, 0)
$Button2 = GUICtrlCreateButton("退出", 312, 146, 73, 33, 0)
GUICtrlCreateLabel("按Win+C键强制退出安装!",314, 224, 73, 33)
GUICtrlSetColor(-1, 0x008000)
GUICtrlSetFont(-1, 8.5, 400, 0, "Arial")
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetOnEvent($Button1,"_Update")
GUICtrlSetOnEvent($button2,"_Exit")
GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")
HotKeySet("#c","_Exit")
GUISetState(@SW_SHOW)
While 1
Sleep(1000)
WEnd
Func _Update()
$message="正在搜索补丁更新文件..."
GUICtrlSetData($label3,$message)
Sleep(1000)
Dim $filelist[1];事先定义好1个一维数组,这个很重要,否则在编译后执行可能出现:使用非法树组问题
$filelist=_FileListToArray(@ScriptDir & "\Update","*.exe",1);将已下载补丁所在目录里的文件都送到定义好的1维数组里
If @error =1 Then;判断_FileListToArray()是否成功,如 失败进行相关提示并退出
MsgBox(16,'提示','Update文件夹或里面的补丁文件不存在,程序无法继续运行!')
Exit
EndIf
Dim $j,$n=0,$i
For $j=1 To $filelist[0]
$array=StringSplit($filelist[$j],"-");对于数组中的文件进行KB段提出
;StringInStr($FixedPatchsListPath,$array[2]);$patchslistfile是前面搜索本机已安装补丁的列表文件
$IsFixedPatch=IniRead($FixedPatchsListPath,"已经安装补丁",$array[2],"");判断已经下载的补丁是否已经打过
If $IsFixedPatch="" Then;是未打过的补丁就n计数加1,就是计算机上还没有打的补丁数
$n += 1
EndIf
Next
If $n=0 Then
MsgBox(0,"提示","已下载的目录里没有新补丁可以安装,程序将退出!")
Exit
EndIf
For $i = 3 To 1 Step -1
$message = "共需安装" & $n & "个系统补丁," & $i & "秒后开始安装"
GUICtrlSetData($Label3, $message)
Sleep(1000)
Next
$message = "正在安装..."
GUICtrlSetData($Label3, $message)
Dim $wait = 0, $m = 0
$start = GUICtrlSetData($Progress1, $wait) ;修改进度条的状态
For $j = 1 To $filelist[0]
$array = StringSplit($filelist[$j], "-") ;以指定分隔符把字符串拆分成若干子串
If IniRead($FixedPatchsListPath,"已经安装补丁",$array[2],"") = "" Then
;StringInStr()为检查某个字符串是否含有给定的子串,返回为0未发现
$result = RunWait($FixedPatchsListPath & "" & $filelist[$j] & " /u /z /n /o /q")
$m += 1
;ProgressSet(100/$filelist[0]*$i, "已完成"&100/$filelist[0] *$i& " % ")
$wait = 100 / $n * $m
GUICtrlSetData($Progress1, $wait)
$jindu = "已完成: " & Round($wait, 0) & " %"
GUICtrlSetData($Label3, $jindu)
If $result = 1603 Then
$ending = "安装失败"
Else
$ending = "安装成功"
EndIf
GUICtrlCreateListViewItem($m & "|" & $array[2] & "|" & $ending, $ListView1) ;在GUI上创建一个 ListView 项目控件
EndIf
Next
$jindu = "已完成: 100%"
GUICtrlSetData($Label3, $jindu)
TrayTip("提示", "补丁已安装,请重启电脑!", 6, 1)
EndFunc ;==>update
Func _EnumRegFixedPatchs()
Dim $i=0
While 1
$i +=1
$Var=RegEnumKey($FixedPatchsRegPath,$i)
If @error <>0 Then ExitLoop
;FileWriteLine($FixedPatchsListPath,$Var & @CRLF);向此前已经打开的ini文件中 将枚举出的值逐行写入到指定
IniWrite($FixedPatchsListPath,"已经安装补丁",$Var,"1")
WEnd
EndFunc
Func _Exit()
Exit
EndFunc
|
|