[已解决]请帮助找出以下代码的错误?
本帖最后由 newuser 于 2010-9-26 12:01 编辑执行假死机?Dim$i,$CommonReg
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates"
_EnumRegProcess1()
_EnumRegProcess2()
Func _EnumRegProcess1()
While1
$i +=1
$EnumResult=RegEnumKey($CommonReg,$i)
If @error <> 0ThenExitLoop
IniWrite(@ScriptDir&"\FixedPatchsList1.ini","已安装补丁列表",$EnumResult,"1")
WEnd
EndFunc
Func _EnumRegProcess2()
While 1
$Array=IniReadSection(@ScriptDir&"\FixedPatchsList1.ini","已安装补丁列表")
If @error Then
MsgBox(0,"错误提示:","发生读取初始化文件错误")
ExitLoop
Else
For $i=1 To $Array
String($Array[$i])
If StringInStr($Array[$i],"KB") Then
IniWrite(@ScriptDir&"\FixedPatchsList2.ini","已安装补丁列表",$Array[$i],"1")
Else
$CommonReg=$Array[$i]
$EnumResult=RegEnumKey($CommonReg,$i)
If @error <> 0ThenExitLoop
$KBString = StringRegExpReplace($EnumResult, '.*?(KB\d+)[^\d]*?.*', '$1')
If @extended > 0 Then IniWrite(@ScriptDir&"\FixedPatchsList2.ini","已安装补丁列表",$KBString,"1")
EndIf
Next
EndIf
WEnd
EndFunc RegEnumKey不会报错,如果要退出循环 if $EnumResult='' then 回复 2# netegg
我是想执行完循环得到那个最终的INI文件再退出,那个if 判断该加到哪里呢?
其实我就是想执行向下面代码的类似结果,但显然它的判断的分支少了,而且看上去代码不精简!!!#cs
新增对分支HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates的枚举,以下都是该分支下的分支(注意有 XP和WinServer2003):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP4
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows Server 2003\SP10
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows Server 2003\SP2
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows Server 2003\SP3
#ce
#include <File.au3>
Dim$i,$Array
Dim$EnumRegPath1,$EnumRegPath2,$EnumRegPath3
Dim$XP_SP0,$XP_SP2,$XP_SP3,$XP_SP4,$2003_SP10,$2003_SP2,$2003_SP3
Dim$CommonReg
;$EnumRegPath1="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix"
;$EnumRegPath2="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates"
_EnumRegProcess1()
If @OSVersion="WIN_XP" Then
_EnumRegProcess2()
_EnumRegProcess3()
_EnumRegProcess4()
_EnumRegProcess5()
ElseIf @OSVersion="WIN_2003" Then
_EnumRegProcess6()
_EnumRegProcess7()
_EnumRegProcess8()
Else
MsgBox(0,"","抱歉,目前你的系统还不被支持!")
EndIf
$Lines=_FileCountLines(@ScriptDir&"\FixedPatchsList2.ini")
MsgBox(0,"行数",$Lines)
Func _EnumRegProcess1()
While1
$i +=1
$EnumResult=RegEnumKey($CommonReg,$i)
If @error <> 0ThenExitLoop
$KBString = StringRegExpReplace($EnumResult, '.*?(KB\d+)[^\d]*?.*', '$1')
If @extended > 0 Then IniWrite(@ScriptDir&"\FixedPatchsList2.ini","已安装补丁列表",$KBString,"1")
WEnd
EndFunc
Func _EnumRegProcess2()
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP0"
_EnumRegProcess1()
EndFunc
Func _EnumRegProcess3()
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP2"
_EnumRegProcess1()
EndFunc
Func _EnumRegProcess4()
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP3"
_EnumRegProcess1()
EndFunc
Func _EnumRegProcess5()
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\SP4"
_EnumRegProcess1()
EndFunc
Func _EnumRegProcess6()
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows Server 2003\SP10"
_EnumRegProcess1()
EndFunc
Func _EnumRegProcess7()
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows Server 2003\SP2"
_EnumRegProcess1()
EndFunc
Func _EnumRegProcess8()
$CommonReg="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows Server 2003\SP3"
_EnumRegProcess1()
EndFunc
回复 3# newuser
不太理解你的意思。
也不太明白补丁在注册表中的结构。
不过看你上面代码中大概有这个规律:
WINDOWS XP中是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP\XXX
WINDOWS 2003中是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows Server 2003\XXX
以XP为例:为什么不枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows XP下的子键,再判断呢? 执行假死机?
newuser 发表于 2010-9-25 15:42 http://www.autoitx.com/images/common/back.gif
死循环? 回复 4# 3mile
sp0 sp1...就是windows xp下的子键啊!一楼的代码就是想象阁下说的那样,但没按照我的想法执行 回复 6# newuser
#include <Array.au3>
#include <WinAPIEx.au3>
Local $hKey, $Count, $Num = 0
Local $Vkey = 'SOFTWARE\Microsoft\Updates\Windows XP'
Local $aKey
$array=EnumKey($Vkey)
_ArrayDisplay($array)
If UBound($array) > 0 Then
For $i = 0 To UBound($array) - 1
$Wkey = $Vkey & '\' & $aKey[$i]
$keyArray=EnumKey($Wkey)
_ArrayDisplay($keyArray)
If UBound($keyArray)>0 Then
For $n=0 To UBound($keyArray)-1
IniWrite("hotfixed.ini","hotfixed",$keyArray[$n],"1")
Next
EndIf
Next
EndIf
Func EnumKey($Key)
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, $key)
$Count = _WinAPI_RegQueryInfoKey($hKey)
Dim $aKey[$Count]
For $i = 0 To UBound($aKey) - 1
$aKey[$i] = _WinAPI_RegEnumKey($hKey, $i)
Next
_WinAPI_RegCloseKey($hKey)
If Not IsArray($aKey) Then
Return -1
Else
Return $aKey
EndIf
EndFunc ;==>EnumKey
本帖最后由 newuser 于 2010-9-26 07:48 编辑
回复 7# 3mile
谢谢! 只枚举了SP0的KB,如图:
回复 7# 3mile
回复 7# 3mile
第1轮循环进行完毕,但是在进入第2轮子循环,就没有全进行下去或者说没有进行完整?#include <Array.au3>
#include <WinAPIEx.au3>
Local $hKey, $Count, $Num = 0
Local $Vkey = 'SOFTWARE\Microsoft\Updates\Windows Server 2003';第一好要枚举的父键
Local $aKey
$array=EnumKey($Vkey);首先定义了枚举的变量后在用函数枚举
_ArrayDisplay($array);显示返回的数组
If UBound($array) > 0 Then;如果返回的数组维度大于0
For $i = 0 To UBound($array) - 1;从0 到 2
$Wkey = $Vkey & '\' & $aKey[$i]
;第1个$Wkey是:SOFTWARE\Microsoft\Updates\Windows Server 2003\SP10
;可是 第1个再EnumKey()后,后续的$i=1和$i=2没进行?
$keyArray=EnumKey($Wkey)
MsgBox(0,"第"&$i&"的UBound($keyArray)维度是",UBound($keyArray))
_ArrayDisplay($keyArray)
If UBound($keyArray)>0 Then
For $n=0 To UBound($keyArray)-1
IniWrite("hotfixed.ini","hotfixed",$keyArray[$n],"1")
Next
EndIf
Next
EndIf
Func EnumKey($Key)
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, $key)
;MsgBox(0,'$hKey',$hKey)
;打开指定的键的子键,父键:$HKEY_LOCAL_MACHINE,子键:$Key,它实际接受变量$Vkey的值
$Count = _WinAPI_RegQueryInfoKey($hKey) ;检索指定键的相关信息,理解为$key下有多少项或其相关信息
;MsgBox(0,'$Count',$Count&" "&$Count&" "&$Count&" "&$Count )
Dim $aKey[$Count];第一一个一维数组,有三个元素
;MsgBox(0,'UBound($aKey)',UBound($aKey))
For $i = 0 To UBound($aKey) - 1;$aKey数组的维度是3,数组下标确是从0 到 2
$aKey[$i] = _WinAPI_RegEnumKey($hKey, $i);枚举指定打开键下的子键
MsgBox(0,"第"&$i&"个枚举信息",$aKey[$i])
Next
_WinAPI_RegCloseKey($hKey);关闭打开的键
If Not IsArray($aKey) Then
Return -1;如果$aKey不是数组,返回值 -1
Else
Return $aKey;返回指定的数组
EndIf
EndFunc ;==>EnumKey 回复 10# newuser
第11行的问题。
#include <Array.au3>
#include <WinAPIEx.au3>
Local $hKey, $Count, $Num = 0
Local $Vkey = 'SOFTWARE\Microsoft\Updates\Windows Server 2003';第一好要枚举的父键
Local $aKey
$array=EnumKey($Vkey);首先定义了枚举的变量后在用函数枚举
_ArrayDisplay($array);显示返回的数组
If UBound($array) > 0 Then;如果返回的数组维度大于0
For $i = 0 To UBound($array) - 1;从0 到 2
$Wkey = $Vkey & '\' & $array[$i]
;第1个$Wkey是:SOFTWARE\Microsoft\Updates\Windows Server 2003\SP10
;可是 第1个再EnumKey()后,后续的$i=1和$i=2没进行?
$keyArray=EnumKey($Wkey)
MsgBox(0,"第"&$i&"的UBound($keyArray)维度是",UBound($keyArray))
_ArrayDisplay($keyArray)
If UBound($keyArray)>0 Then
For $n=0 To UBound($keyArray)-1
IniWrite("hotfixed.ini","hotfixed",$keyArray[$n],"1")
Next
EndIf
Next
EndIf
Func EnumKey($Key)
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, $key)
;MsgBox(0,'$hKey',$hKey)
;打开指定的键的子键,父键:$HKEY_LOCAL_MACHINE,子键:$Key,它实际接受变量$Vkey的值
$Count = _WinAPI_RegQueryInfoKey($hKey) ;检索指定键的相关信息,理解为$key下有多少项或其相关信息
;MsgBox(0,'$Count',$Count&" "&$Count&" "&$Count&" "&$Count )
Dim $aKey[$Count];第一一个一维数组,有三个元素
;MsgBox(0,'UBound($aKey)',UBound($aKey))
For $i = 0 To UBound($aKey) - 1;$aKey数组的维度是3,数组下标确是从0 到 2
$aKey[$i] = _WinAPI_RegEnumKey($hKey, $i);枚举指定打开键下的子键
MsgBox(0,"第"&$i&"个枚举信息",$aKey[$i])
Next
_WinAPI_RegCloseKey($hKey);关闭打开的键
If Not IsArray($aKey) Then
Return -1;如果$aKey不是数组,返回值 -1
Else
Return $aKey;返回指定的数组
EndIf
EndFunc ;==>EnumKey 我在同事的计算机测试,出现以下错误!
回复 12# newuser
晕,包含文件啊。
WINAPIex.AU3 回复 11# 3mile
在同事的计算机上出现了:数组变量格式错误.
问题应该是这行: Dim $aKey[$Count],
但是在我的计算机上怎么好使! 回复 14# newuser
如果确定是这一句 Dim $aKey[$Count]
那么应该是$Count出错,也就是说前一行$Count = _WinAPI_RegQueryInfoKey($hKey)并未取得子键数目。
两种可能:1、键不存在,即$Count返回空值。
2、可能性极大的是:包含文件WINAPIEX.AU3文件在你同事的机器上没有。于是出现上图的错误,继续执行的话$Count = _WinAPI_RegQueryInfoKey($hKey)这行返回错误代码或未执行。
解决办法:复制WINAPIEX.AU3文件到你同事机器上。
页:
[1]
2