Что нового

Проверка на наличие установленного ПО

SavickiyAV

Новичок
Сообщения
23
Репутация
0
Добрый день написал скрипт который тянет с ФТП архив потом его разворачивает и автоматически устанавливает. Если ПО на ПК раньше не стояло то проблемы нет а вот если оно уже стоит и я ставлю версию новее то все идет наперекосяк. Вопрос в том как лучше проверить наличие ПО на ПК? У меня из идей поиск по реестру но может есть другие более правильные варианты? В идеале при наличии ПО на ПК сразу удалять его. Может у кого то уже есть заготовка подобного рода
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
поиск только в реестре. в ветке uninstall
 

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Добавлю свои «пять копеек»: есть общесистемная ветка uninstall и ветка для текущего юзера
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall
кроме того, под x64 м.б. придётся поискать ещё и здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
А некоторые разработчики изощряются непредсказуемым образом, и следы софтины приходится искать в самых неожиданных местах…
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код ниже возвращает в массиве установленное ПО
Код:
#include <Array.au3>
Local $aPath = _CGW()
_ArrayDisplay($aPath)
Func _CGW()
    Local $all_key[3]
    $all_key[0] = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    $all_key[1] = "HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    $all_key[2] = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall'
    Local $aSA[0][2], $AppKey_all, $n = 0, $X = 1, $rn, $il
    For $i = 0 To 2
        Local $a = 1
        While 1
            $AppKey_all = RegEnumKey($all_key[$i], $a)
            If Not $AppKey_all Then ExitLoop
            $rn = StringStripWS(StringReplace(RegRead($all_key[$i] & "\" & $AppKey_all, "DisplayName"), " (remove only)", ""), 3)
            $il = StringStripWS(RegRead($all_key[$i] & "\" & $AppKey_all, "InstallLocation"), 3)
            If $rn <> '' And $il <> '' Then
                ReDim $aSA[$X][2]
                $aSA[$n][0] = $rn
                If StringRight($il, 1) = '\' Then $il = StringTrimRight($il, 1)
                $aSA[$n][1] = StringReplace($il, '"', '')
                $n += 1
                $X += 1
            EndIf
            $a += 1
        WEnd
    Next
    Return $aSA
EndFunc   ;==>_CGW
 
Верх