Версия AutoIt: 3+
Описание:
Приветствую. Необходимо написать программу, которая определяет все установленные программы и удаляет нужную по конкретному названию.
Взял код с форума на поиск всех установленных программ, а как допилить на удаление - не знаю :'(
Примечания:
Т.е. по идее, эта часть программы должна копировать данные о нужной программе, и затем исполнять ключ на удаление(msiexec.exe /x {*} /qn), взятый из скопированных данных.
P.S. Вся загвоздка в том, что после обновления программы меняется ключ и заданный в uninstaller'e не работает.
P.S.S. Имеется свой деинсталлятор, который должен удалять 2 других программы и себя, для этого и нужно получать ключи на удаление.
P.S.S.S. Вообщем, необходима прожка, которая по заданному имени, автоматически удаляет программу.
Спасибо за помощь!
Описание:
Приветствую. Необходимо написать программу, которая определяет все установленные программы и удаляет нужную по конкретному названию.
Взял код с форума на поиск всех установленных программ, а как допилить на удаление - не знаю :'(
Код:
#Include <Array.au3>
Dim $aSoftwareInfo, $aSoftwareInfo2, $aSoftwareInfo3
If @OSArch = 'x64' Then
Global $Path1 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
Global $Path2 = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
Global $PathUser = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
Else
Global $Path1 = 'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall'
Global $PathUser = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
EndIf
If @OSArch = 'x64' Then
_ComputerGetSoftware($aSoftwareInfo)
_ComputerGetSoftware2($aSoftwareInfo2)
_ComputerGetSoftware3($aSoftwareInfo3)
While 1
$StringZero = _ArrayFindAll($aSoftwareInfo, '')
If _ArrayFindAll($aSoftwareInfo, '') = @error Then
ExitLoop
EndIf
_ArrayDelete($aSoftwareInfo, _ArrayMax($StringZero))
If _ArrayMax($StringZero) = 0 Then
ExitLoop
EndIf
WEnd
While 1
$StringZero2 = _ArrayFindAll($aSoftwareInfo2, '')
If _ArrayFindAll($aSoftwareInfo2, '') = @error Then
ExitLoop
EndIf
_ArrayDelete($aSoftwareInfo2, _ArrayMax($StringZero2))
If _ArrayMax($StringZero2) = 0 Then
ExitLoop
EndIf
WEnd
While 1
$StringZero3 = _ArrayFindAll($aSoftwareInfo3, '')
If _ArrayFindAll($aSoftwareInfo3, '') = @error Then
ExitLoop
EndIf
_ArrayDelete($aSoftwareInfo3, _ArrayMax($StringZero3))
If _ArrayMax($StringZero3) = 0 Then
ExitLoop
EndIf
WEnd
_ArraySort($aSoftwareInfo)
_ArraySort($aSoftwareInfo2)
_ArraySort($aSoftwareInfo3)
_ArrayUnique($aSoftwareInfo)
_ArrayUnique($aSoftwareInfo2)
_ArrayUnique($aSoftwareInfo3)
_ArrayDisplay($aSoftwareInfo, 'Основное для установленных x32 приложений')
_ArrayDisplay($aSoftwareInfo, 'Основное для установленных x64 приложений')
_ArrayDisplay($aSoftwareInfo3, 'Пользовательское')
_ArrayDisplay($aSoftwareInfo)
_ArrayDisplay($aSoftwareInfo2)
_ArrayDisplay($aSoftwareInfo3)
Exit
Else
_ComputerGetSoftware($aSoftwareInfo)
_ComputerGetSoftware3($aSoftwareInfo3)
While 1
$StringZero = _ArrayFindAll($aSoftwareInfo, '')
If _ArrayFindAll($aSoftwareInfo, '') = @error Then
ExitLoop
EndIf
_ArrayDelete($aSoftwareInfo, _ArrayMax($StringZero))
If _ArrayMax($StringZero) = 0 Then
ExitLoop
EndIf
WEnd
While 1
$StringZero3 = _ArrayFindAll($aSoftwareInfo3, '')
If _ArrayFindAll($aSoftwareInfo3, '') = @error Then
ExitLoop
EndIf
_ArrayDelete($aSoftwareInfo3, _ArrayMax($StringZero3))
If _ArrayMax($StringZero3) = 0 Then
ExitLoop
EndIf
WEnd
_ArraySort($aSoftwareInfo)
_ArraySort($aSoftwareInfo3)
_ArrayUnique($aSoftwareInfo)
_ArrayUnique($aSoftwareInfo3)
_ArrayDisplay($aSoftwareInfo, 'Основное')
_ArrayDisplay($aSoftwareInfo3, 'Пользовательское')
Exit
EndIf
Func _ComputerGetSoftware(ByRef $aSoftwareInfo)
Local Const $UnInstKey = $Path1
Local $i = 1
Dim $aSoftwareInfo[1][4]
While 1
$AppKey = RegEnumKey($UnInstKey, $i)
If @error <> 0 Then ExitLoop
ReDim $aSoftwareInfo[UBound($aSoftwareInfo) + 1][4]
$aSoftwareInfo[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3)
$aSoftwareInfo[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
$aSoftwareInfo[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
$aSoftwareInfo[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3)
$i += 1
WEnd
$aSoftwareInfo[0][0] = UBound($aSoftwareInfo, 1) - 1
If $aSoftwareInfo[0][0] < 1 Then
SetError(1, 1, 0)
EndIf
EndFunc
Func _ComputerGetSoftware2(ByRef $aSoftwareInfo2)
Local Const $UnInstKey = $Path2
Local $i = 1
Dim $aSoftwareInfo2[1][4]
While 1
$AppKey = RegEnumKey($UnInstKey, $i)
If @error <> 0 Then ExitLoop
ReDim $aSoftwareInfo2[UBound($aSoftwareInfo2) + 1][4]
$aSoftwareInfo2[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3)
$aSoftwareInfo2[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
$aSoftwareInfo2[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
$aSoftwareInfo2[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3)
$i += 1
WEnd
$aSoftwareInfo2[0][0] = UBound($aSoftwareInfo2, 1) - 1
If $aSoftwareInfo2[0][0] < 1 Then
SetError(1, 1, 0)
EndIf
EndFunc
Func _ComputerGetSoftware3(ByRef $aSoftwareInfo3)
Local Const $UnInstKey = $PathUser
Local $i = 1
Dim $aSoftwareInfo3[1][4]
While 1
$AppKey = RegEnumKey($UnInstKey, $i)
If @error <> 0 Then ExitLoop
ReDim $aSoftwareInfo3[UBound($aSoftwareInfo3) + 1][4]
$aSoftwareInfo3[$i][0] = StringStripWS(StringReplace(RegRead($UnInstKey & "\" & $AppKey, "DisplayName"), " (remove only)", ""), 3)
$aSoftwareInfo3[$i][1] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "DisplayVersion"), 3)
$aSoftwareInfo3[$i][2] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "Publisher"), 3)
$aSoftwareInfo3[$i][3] = StringStripWS(RegRead($UnInstKey & "\" & $AppKey, "UninstallString"), 3)
$i += 1
WEnd
$aSoftwareInfo3[0][0] = UBound($aSoftwareInfo3, 1) - 1
If $aSoftwareInfo3[0][0] < 1 Then
SetError(1, 1, 0)
EndIf
EndFunc
Примечания:
Т.е. по идее, эта часть программы должна копировать данные о нужной программе, и затем исполнять ключ на удаление(msiexec.exe /x {*} /qn), взятый из скопированных данных.
P.S. Вся загвоздка в том, что после обновления программы меняется ключ и заданный в uninstaller'e не работает.
P.S.S. Имеется свой деинсталлятор, который должен удалять 2 других программы и себя, для этого и нужно получать ключи на удаление.
P.S.S.S. Вообщем, необходима прожка, которая по заданному имени, автоматически удаляет программу.
Спасибо за помощь!