如何判断程序安装成功?
现已经实现自动安装程序成功,但是我想知道程序是否安装成功,应该怎么去检测呢,注册表?开始菜单?控制面板?因为涉及到多个语言系统,需要考虑语言问题,有没有可以判断很准确的办法呢? 晕,这个不懂了,检测下安装目录是否存在不可以吗? 回复 2# mo_shaojie不知道安装目录存在是不是就一定安装成功,想要去开始菜单去查看来判断,但是怎么去查看开始菜单呢?又涉及到多语言系统 程序安装成功?安装程序运行完毕还有安装不成功的吗?那么什么叫做安装不成功呢?
我的想法是:运行安装的程序,某特定窗口出现,安装即成功,关闭程序,验证结束! 遇到过这种情况,安装重启回来,程序的某一部分安装不成功,比如驱动未安装上,应用程序不存在。现在采用的办法是利用@ProgramsCommonDir进入Program文件夹,然后查找安装的目录,登陆应用程序,这样可以检测应用程序是否成功。至于驱动是否成功,我想知道的是,注册表里面有的话,是不是就一定表明驱动安装成功了呢?还是要检测Device Manager里面的信息,或者控制面部的信息,还是三者都要呢? 驱动可以判断安装后驱动版本和你提供的版本是不是相符,注册表里面有 先不说安装问题,就说说你那多语言问题,AU3的宏不就可以解决?比如@ProgramsCommonDir 回复 7# tryhi
是的,现在多语言的问题是采用宏来解决的 回复 6# yhxhappy
那是不是只检查注册表就可以了呢? 遇到过这种情况,安装重启回来,程序的某一部分安装不成功,比如驱动未安装上,应用程序不存在。现在采用的 ...
ransally 发表于 2010-12-6 18:03 http://www.autoitx.com/images/common/back.gif
这种情况应该不太好检测吧?直观的方法就是安装完了运行一次,如果是批量安装的话,这有点行不通就是了。 软件的问题我就不讨论了,至于驱动安装完成与否,可以通过判断注册表里面的版本与安装的版本是否一致,一致则表示安装成功。虽然不能100%正确,但还是比较稳妥的
下面的源码是演示如何取设备的驱动版本,楼主自己研究吧#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiTreeView.au3>
#include <SetupApi.au3>
Local $Hardware
Local $Class
$FORM = GUICreate("本机硬件信息", 800, 700)
$Tree = GUICtrlCreateTreeView(0, 0, 800, 700)
_HardwareScan()
GUISetState(@SW_SHOW) ; 显示窗口
;运行窗口直到用户关闭
While 1
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
WEnd
Func _HardwareScan() ;扫描本机硬件信息并将信息添加至 TREE 控件
$aClass = _CM_Enumerate_Classes()
For $i = 1 To $aClass
If $aClass[$i] = "{8ECC055D-047F-11D1-A537-0000F8753ED1}" Then ContinueLoop ;非即插即用设备 排除
;If $Class[$i] = "{4d36e96b-e325-11ce-bfc1-08002be10318}" Then ContinueLoop ;PS2键盘排除
;If $Class[$i] = "{4d36e96f-e325-11ce-bfc1-08002be10318}" Then ContinueLoop ;PS2鼠标排除
;If $Class[$i] = "{745A17A0-74D3-11D0-B6FE-00A0C90F57DA}" Then ContinueLoop ;USB输入设备,含USB鼠标排除
;If $Class[$i] = "{36FC9E60-C465-11CF-8056-444553540000}" Then ContinueLoop ;通用串行总线控制器排除
;If $Class[$i] = "{4D36E96E-E325-11CE-BFC1-08002BE10318}" Then ContinueLoop ;监示器排除
$Device = _CM_Enum_Device_Info($aClass[$i]) ;根据 Class 来枚举子项设备
If $Device <> 0 Then ;如果该 Class 下的子设备为 0 则跳过
For $a = 1 To $Device
$iStatus = _CM_Get_DevNode_Status($Device[$a]) ;根据设备号来判断设备是否在 设备管理器 内显示出来 $DN_NO_SHOW_IN_DM
If bitAND($iStatus, $DN_NO_SHOW_IN_DM) Then ContinueLoop
$ID = _CM_Get_DevNode_Registry_Property($Device[$a], 2) ;根据设备中断号取硬件ID
$xx = StringInStr($ID, "\" ) ;在硬件ID里面查找 \ 这个符号
If $xx = 0 Then ;如果没有打到,则这个ID就当做硬件ID来使用
$HardwareID = $ID
Else
$IDarray = StringSplit($ID, StringMid($ID, 1, $xx), 1) ;使用特定字符将ID字符串分割,例如PCI\,IDE\,
$HardwareID = $IDarray
EndIf
ReDim $Hardware
$Hardware = $aClass[$i] ;将设备所属的 Class 写进 $Hardware_ID
$Hardware = $Device[$a] ;将设备名称 写进数组
$Hardware = Get_Driver_Version($Device[$a]) ;根据设备中断号取驱动版本 那个数字是不是中断号我也不确定,自己这么理解的
$Hardware = $HardwareID
$Hardware = UBound($Hardware)-1
If _ArraySearch($Class, $aClass[$i]) = -1 Then
ReDim $Class ;将本项设备的 Class 写进 $Class数组
$Class = $aClass[$i]
$Class = UBound($Class)-1
EndIf
Next
EndIf
Next
_ArraySort($Class) ;排序类数组
_ArraySort($Hardware) ;排序硬件数组
$hItem = GUICtrlCreateTreeViewItem(@ComputerName, $Tree) ;计算机名添加进 TREE控件
For $i = 1 To $Class
$hItem2 = GUICtrlCreateTreeViewItem($Class[$i], $hItem) ;大类
For $a = 1 To $Hardware
If $Hardware[$a] = $Class[$i] Then
$hItem3 = GUICtrlCreateTreeViewItem($Hardware[$a], $hItem2) ;硬件添加进 TREE内的大类,如显卡设备属于 显示适配器 类
GUICtrlCreateTreeViewItem("硬件ID:" & $Hardware[$a], $hItem3)
GUICtrlCreateTreeViewItem("驱动版本:" & $Hardware[$a], $hItem3)
EndIf
Next
Next
GUICtrlSetState($hItem, $GUI_EXPAND) ;展开 TREE 控件 根目录
EndFunc
Func Get_Driver_Version($hDevInst) ;取得驱动的版本,根据中断号
$ClassGUID = _CM_Get_DevNode_Registry_Property($hDevInst, 10)
If $ClassGUID = "" Then Return "Unknown" ;如果范例ID为空,则返回0并退出
If @OSArch = "X86" Then
$Reg = "HKLM\SYSTEM\ControlSet001\Control\Class\"
Else
$Reg = "HKLM64\SYSTEM\ControlSet001\Control\Class\"
EndIf
$Version = RegRead($Reg & $ClassGUID, "DriverVersion")
If $Version = "" Then ;如果使用逗号无法分割,则说明读取到的内容不符,返回0
Return "Unknown"
Else
Return $Version
EndIf
EndFunc 回复 11# yhxhappy
谢谢Happy If MsgBox(36,"请问","是否安装成功?")=6 Then msgbox(0,"","执行完毕")
页:
[1]