wolkow70, функция
un.INSTFILES_LEAVE выполняется ВСЕГДА!
Проверяет наличие файлика DefragglerShell.dll и на основе проверки "решает" показывать стр. перезагрузки
сейчас или нет!
И принудительно устанавливает флаги перезагрузки - банальная перестраховка.
Код:

${If} ${FileExists} "$INSTDIR\DefragglerShell.dll"
Delete /REBOOTOK "$INSTDIR\DefragglerShell.dll"
SetRebootFlag true
${Else}
SetRebootFlag false
${EndIf}
И еще один момент, если удаление задано с флагом
/REBOOTOK, но файлы или файл удалились удачно,
установщик устанавливает флаг перезагрузки -
false,
если неудачное удаление(по каким то причинам) установщик устанавливает флаг перезагрузки -
true
Это легко проверить инсценировкой ситуации, например создать архив и держать архив открытым программой архиватором, то вы не сможете удалить архив, файл занят:
Код:

Delete /REBOOTOK "$EXEDIR\Linker.zip"
Ifrebootflag 0 +2
MessageBox MB_OK "true" IDOK
Ifrebootflag +2
MessageBox MB_OK "false" IDOK
---
А уже на страничке финиша, если
true - установщик предложит перезагрузку.
если
false - установщик не предложит перезагрузку.
---
И еще важный аспект, если вы ловите в скрипте флаг пререзагрузки, не забудьте снова установить
предыдущий флаг перезагрузки при необходимости, потому что команда
Ifrebootflag
определяет состояние флага и после определения сбрасывает в false или в неопределенное состояние.
Код:

Delete /REBOOTOK "$EXEDIR\Linker.zip"
Ifrebootflag 0 +3
MessageBox MB_OK "true" IDOK
SetRebootFlag true
Ifrebootflag +3
MessageBox MB_OK "false" IDOK
SetRebootFlag false
Что вам нужно, решаете сами, поэтому поводу я вам разжевал все и повторяться не буду.