Что нового

Запуск uninstall как в "Add or Remove Programs"

anuta

Новичок
Сообщения
1
Репутация
0
Есть задача удалить программу скриптом через "Add or Remove Programs", да так чтобы работало под винХР и вин7.
Вообще с инсталяторами дела до этого не имела, поэтому возникли вопросы.
Как я поняла, "Add or Remove Programs" берет данные из ветки реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, а дальше там некий {Product_code}, который в моем случае не имеет никакого осмысленного значения, а что хуже - для кажой версии удаляемой программки он будет свой, откуда вопрос номер раз - как найти мою ветку реестра. Как программа называется, версия, производитель - это все известно.
Вопрос номер два: достаточно ли будет просто запустить то, что содержится в ключе UninstallString или нужно еще что-то выполнять?
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
anuta

Код:
; НАЧАЛО

 #RequireAdmin

 Switch @OSArch
  Case "X86"
   $HKLM="HKLM"
   $HKCU="HKCU"
  Case "X64","IA64"
   $HKLM="HKLM64"
   $HKCU="HKCU64"
  Case Else
   MsgBox(0,"","Неизвестная платформа...")
   Exit
 EndSwitch

 $UNINST=$HKLM&"\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

 $COUNTER=1
 $DATA=""

 While True
  $R=RegEnumKey($UNINST,$COUNTER)
  If @error Then ExitLoop
  $COUNTER+=1
  $DN=RegRead($UNINST&"\"&$R,"DisplayName")
  If $DN="" Then ContinueLoop
  $US=RegRead($UNINST&"\"&$R,"UninstallString")
  If $US="" Then ContinueLoop
  $DATA&="|"&$DN
 WEnd

 $GUI=GUICreate("Удаление программы",320,260)
 $LIST=GUICtrlCreateList("",10,10,300,220)
 $BUTTON=GUICtrlCreateButton("Удалить",10,230,300,25)
 
 GUICtrlSetData($LIST,$DATA)

 GUISetState()

 While True
  Switch GUIGetMsg()
    Case -3
     ExitLoop
    Case $BUTTON
     UNINSTALL()
  EndSwitch
 WEnd

 Func UNINSTALL()
  $DNE=GUICtrlRead($LIST)
  $COUNTER=1
  $DATA=""

  While True
   $R=RegEnumKey($UNINST,$COUNTER)
   If @error Then ExitLoop
   $COUNTER+=1
   $DN=RegRead($UNINST&"\"&$R,"DisplayName")
   $US=RegRead($UNINST&"\"&$R,"UninstallString")
   If $DN<>$DNE Then
    If $US="" Then ContinueLoop
    $DATA&="|"&$DN
    ContinueLoop
   EndIf
   GUICtrlSetData($BUTTON,"Ждите...")
   RunWait($US)
   GUICtrlSetData($BUTTON,"Удалить")
  WEnd
  GUICtrlSetData($LIST,$DATA)
 EndFunc

; КОНЕЦ
 
Верх