Что нового

Автоматическое удаление программ

forc1k

Новичок
Сообщения
42
Репутация
1
Версия AutoIt: 3+

Описание:
Приветствую. Необходимо написать программу, которая определяет все установленные программы и удаляет нужную по конкретному названию.
Взял код с форума на поиск всех установленных программ, а как допилить на удаление - не знаю :'(
Код:
#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. Вообщем, необходима прожка, которая по заданному имени, автоматически удаляет программу.
Спасибо за помощь!
 
Верх