Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Большое спасибо. вроде примерно понял.
Вы привели пример File Progress
Там также есть Detail и Gradual progress. Неплохо бы узнать чем они отличаются.
В моём установщике несколько компонентов, которые устанавливаются по желанию клиента. Т.е несколько секций в скрипте имеется... Как в этом случае сохранить адекватность продвижения прогресс бара, если заранее не известно будет ли клиент устанавливать тот или иной компонент или нет. Первая секция обязательна к установке остальные на выбор.
На примере двух секций.
;__________________________________________________
Section "Ключевые составляющие" Sec1
SectionIn RO
RealProgress::FileProgress /NOUNLOAD 0
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 20 ;установка прогресса на 20%.
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 40
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 60
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 80
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 100 ;установка прогресса на 100%.
SectionEnd
Section "Авторские обновления" Sec2
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD ??? ;какой параметр прогресса должен быть?
SectionEnd
;__________________________________________________
Какой параметр прогресса должен быть в случае если клиент захочет установить "Авторские обновления"? По скрипту выходит что после выполнения первой секции прогресс-бар будет на 100%, а установка не завершится, т.к пойдёт выполнения следующей секции. С другой стороны - если клиент не захочет устанавливать "Авторские обновления", то тогда прогресс 100 в первой секции правильный... Довольно сумбурная схема... Как бы так сделать чтобы волков накормить, и овец сохранить? »
Решил вот тоже побаловаться с этим плагинчиком для реального прогресса. По командам Вашего примера выходит, что на команде RealProgress::AddProgress /NOUNLOAD 60 прогресс уже будет на 100%, ибо:
Могу Вам сказать, что команда RealProgress::AddProgress /NOUNLOAD XX отвечает не за установление прогресса на определённом проценте, а за добавление процентов прогресса.
Т.е Вы ставите скажем RealProgress::AddProgress /NOUNLOAD 20 (где 20 - прибавляемый процент). Далее ставите RealProgress::AddProgress /NOUNLOAD 40, прогресс-бар будет на уровне 60%, а не 40%, т.к стартовую величину задала предыдущая команда. 20+40=60.
Команда же RealProgress::FileProgress XX ориентируется на постепенное продвижение до заданного параметра (XX - процент продвижения до которого двигается прогресс бар). Т.е скажем вы установили RealProgress::FileProgress 20. В момент установки (в зависимости от ваших команд) идёт извлечение файла, пока идёт это извлечение - индикатор прогресса постепенно продвигается до 20%.
А за установление прогресса на определённом проценте отвечает команда RealProgress::SetProgress /NOUNLOAD 10 (где 10 - процент прогресса). На любом этапе установки Вы можете выставить эту команду и прогресс бар будет заполнен на указанный вами процент.
Рекомендую грамотно смешивать эти возможности.
Если продуманно подойти, то прогресс-бар будет максимально реальным.
Ну а автору плагина (Afrow UK) большой респект.
Aster, да, теперь всё окончательно понятно. спасибо
RealProgress::SetProgress /NOUNLOAD вот что нужно было юзать мне
Paval, Пишу инсталяцию на nsis. В дополнение к основному продукту нужно еще поставить пару отдельных программ. Я их упаковываю в свой инсталятор. И прописываю на исполнение ExecWait.
Вроде объяснил понятно. Теперь, как их вызвать в пассивном режиме и прописать путь для установки. »
ExecWait '"$INSTDIR\VCRedist_x64.exe" /q:a /c:"msiexec /i VCRedist.msi /qn"'
или
ExecWait '"$INSTDIR\VCRedist_x64.exe" /q:a /c:"msiexec /i VC_Red.msi /qn"'
wolkow70
07-03-2012, 18:05
Товарищи подскажите оптимальное решение таких задач:
1. Нужно скопировать (распаковать) файл в системную папку, при соблюдении условия, если в ней нет одноименного файла более новой версии.
2. Соответсвенно при деинсталляции комманда на удаление этого файла, если он имеет определенную версию (файл новой версии не должен удаляться).
Задача возникла из-за того, что две программы от одного производителя ставят драйвера службы дефрагментации, причем в одной программе версия более новая.
kotkovets
07-03-2012, 18:36
wolkow70, Получать версию файла умеете?
ну так сравните исходно устанавливаемую версию с полученной версией файла, при наличии файла,
иначе ставим файл какой есть в установщике.
!include "filefunc.nsh"
!include "WordFunc.nsh"
!define VERSION_FILE "3.7.61b" ;(исходная) версия файла в скрипте, которая будет "ставится"
${If} ${FileExists} "$WINDIR\notepad.exe"
${GetFileVersion} "$WINDIR\notepad.exe" "$0"
;конвертируем версию в "циферки" при наличии указанных символов
${VersionConvert} "$0" "abcdefghijklmnopqrstuvwxyz+" "$0"
;конвертируем версию файла в установщике
${VersionConvert} "${VERSION_FILE}" "abcdefghijklmnopqrstuvwxyz+" "$1"
;сравниваем исходно полученную и исходно устанавливаемую версии файлов
;-----------------------------------------------------
;${VersionCompare} "[Version1]" "[Version2]" $var
;-----------------------------------------------------
;"[Version1]" ; первая версия
;"[Version2]" ; вторая версия
;$var ; результат:
;$var=0 версии равны
;$var=1 первая версия новее второй
;$var=2 вторая версия новее первой
;-----------------------------------------------------
${VersionCompare} "$0" "$1" $2
${If} $2 == 0
MessageBox MB_OK "Версии равны!$\n$0 = $1" IDOK
${ElseIf} $2 == 1
MessageBox MB_OK "Полученная версия новее исходной(устанавливаемой)$\n$\t $0 > $1" IDOK
${ElseIf} $2 == 2
MessageBox MB_OK "Исходная(устанавливаемая)версия новее полученной$\n$\t $0 < $1" IDOK
${EndIf}
${Else}
;тут всегда ставим, файла нету!!!
${EndIf}
Здесь легко потренироваться, подставляя циферки в константу
kotkovets, не могу понять как сделать проверку выбран ли пункт в SectionGroup или нет...
И в зависимости от того выбран он или нет выполнить в другой Section (не в SectionGroup) то или иное действие.
Всяко разно извращаюсь, но так и не получается :(
И как всегда всё окажется проще простого :D
kotkovets
08-03-2012, 12:42
BuZzOFF, секционная группа имеет. если не ошибаюсь, 5 состояний:
1. группа вся выбрана - т.е все секции в группе выбраны
2. группа частично выбрана - т.е секция выбрана, а другие не выбраны, не важно количество выбр. или не выбр. секций
3. группа не выбрана - т.е все секции в группе не отмечены.
4. группа свернута - секции спрятаны в группе
5. группа развернута - т.е видны все секции в группе.
Если нужно найти определенную секцию - отмечена или нет, то группа по барабану.
Если нужно, проверить состояние группы, здесь надо учитывать флаг еще: развернута группа или нет.
почитайте в справке: » SectionGetFlags: получаем статус секции, там мало букафф.
что не поймете - пишите.
кстати я всегда снимаю состояние секций в функции закрытия странички компонентов, очень удобно,
ибо я уже знаю, на страничке установки какие секции отмечены или нет, с любой отмеченной секции,
на страничке установки, ведь код будет выполняться, только, если секция отмечена :)
нужно найти определенную секцию - отмечена или нет »Вот это надо :)
Ушёл читать.
Спасибо.
kotkovets, что не получается...
http://s14.directupload.net/images/120309/temp/vycbfy9x.png (http://s14.directupload.net/images/120309/vycbfy9x.png)
Выбираю оригинал (пофиг тихая/не тихая) запускается обычная установка.
Выбираю mod (пофиг тихая/не тихая) запускается mod в тихом режиме.
Такие вот пироги...
Вот часть скрипта:
SectionGroup /e "Тип установки"
Section /o "Обычная" secNormal
SectionEnd
Section "Тихая" secSilent
SectionEnd
SectionGroupEnd
Section "Оригинал" secOriginal
SectionGetFlags ${secNormal} $0
${If} $0 == 1
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1'
${Else}
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /qn'
${EndIf}
SectionEnd
Section /o "Mod" secMod
SectionGetFlags ${secNormal} $0
${If} $0 == 1
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /v"TRANSFORMS=ksospc.ru.mst"'
${Else}
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /v"TRANSFORMS=ksospc.ru.mst /qn"'
${EndIf}
SectionEnd
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${secNormal}
!insertmacro RadioButton ${secSilent}
!insertmacro EndRadioButtons
!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${secOriginal}
!insertmacro RadioButton ${secMod}
!insertmacro EndRadioButtons
FunctionEnd
Function .OnInit
StrCpy $1 ${secSilent}
StrCpy $2 ${secOriginal}
FunctionEnd
"Рожденный ползать - летать не может!"
Видать несудьба мне с этим NSIS :teeth:
wolkow70
09-03-2012, 08:45
kotkovets,
Помогите разобраться с автозакрытием программ
Нужно перед установкой Орбита закрыть браузеры
В скрипте:
!include WinMessages.nsh
Function CloseProgram
Exch $1
Push $0
loop:
FindWindow $0 $1
IntCmp $0 0 done
#SendMessage $0 ${WM_DESTROY} 0 0
SendMessage $0 ${WM_CLOSE} 0 0
Sleep 100
Goto loop
done:
Pop $0
Pop $1
FunctionEnd
Function .onInit
;
loop:
FindWindow $0 "IEFrame"
IntCmp $0 0 done
IsWindow $0 0 done
System::Call 'user32::PostMessageA(i,i,i,i) i($0,${WM_CLOSE},0,0)'
Sleep 100
Goto loop
done:
;
Push "MozillaWindowClass"
Call CloseProgram
Push "OperaWindowClass"
Call CloseProgram
;
FunctionEnd
IE закрывается , а FireFox и Opera нет.
Классы заголовков смотрел в Win32Spy.
закрыть браузеры »
Я конечно очень не спец...
А если искать процессы по имени и "убивать"? Не канает?
Справочник по NSIS => Примеры кодов => Process.
извращенная логика »
Спасибо :teeth:
wolkow70
09-03-2012, 09:31
А если искать процессы по имени и "убивать"? Не канает? »
Канает. Так и было. Только это не "хороший тон", хочу красиво сделать.
kotkovets
09-03-2012, 12:54
BuZzOFF, Чет у вас извращенная логика, проще-проще, вот на кой черт нужно еще:
silent mode и normal mode && silent original и normal original?
Не проще сделать всего лишь: silent mode && silent original, при оболочке - выбор, че ставить,
при тихом режиме заводить ключом ком.строки: silent mode или silent original
Хозяин барин:
SectionGroup /e "Тип установки"
Section /o "Обычная" secNormal
SectionEnd
Section "Тихая" secSilent
SectionEnd
SectionGroupEnd
Section "Оригинал" secOriginal
${If} ${SectionIsSelected} ${secSilent}
MessageBox MB_OK "Original [Silent]" IDOK
${Else}
MessageBox MB_OK "Original [Normal]" IDOK
${EndIf}
SectionEnd
Section /o "Mod" secMod
${If} ${SectionIsSelected} ${secNormal}
MessageBox MB_OK "Mod [Normal]" IDOK
${Else}
MessageBox MB_OK "Mod [Silent]" IDOK
${EndIf}
SectionEnd
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${secNormal}
!insertmacro RadioButton ${secSilent}
!insertmacro EndRadioButtons
!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${secOriginal}
!insertmacro RadioButton ${secMod}
!insertmacro EndRadioButtons
FunctionEnd
Function .OnInit
StrCpy $1 ${secSilent}
StrCpy $2 ${secOriginal}
FunctionEnd
wolkow70, скрипт какой-то древний китайский, покрыт несвежей пылью(но рабочий):
Если браузер найдется появится сообщение(для отладки добавил).
Вообще пускай юзер думает, че ему надо-то, поэтому лучше при запущенном браузере, сообщение
о запущенном браузере и выход из установщика - на мой взгляд оптимальный вариант.
!macro CloseProgram NameProgramm
${Do}
Sleep 200
FindWindow $0 "${NameProgramm}"
${IfThen} $0 == 0 ${|}${Break}${|}
MessageBox MB_OK "Окошко -${NameProgramm}-" IDOK
SendMessage $0 ${WM_CLOSE} 0 0 ;послать окну сообщение WM_CLOSE
SendMessage $0 ${WM_DESTROY} 0 0 ;разрушить окно
${Loop}
!macroend
Function CloseProgram
System::Store S
${Do}
Sleep 200
FindWindow $0 "IEFrame"
${IfThen} $0 == 0 ${|}${Break}${|}
;послать сообщение немедленно, вне очереди cообщений оконной поцедуры
MessageBox MB_OK "ослика окошко найдено" IDOK
System::Call "user32::PostMessage(ir0,i${WM_CLOSE},i0,i0)"
${Loop}
!insertmacro CloseProgram "OperaWindowClass"
!insertmacro CloseProgram "MozillaWindowClass"
System::Store L
FunctionEnd
Function .onInit
Call CloseProgram
FunctionEnd
wolkow70
09-03-2012, 14:19
wolkow70, скрипт какой-то древний китайский, покрыт несвежей пылью(но рабочий):
Если браузер найдется появится сообщение(для отладки добавил). »
Нормально работает. Почему-то окно Mozilla три раза подряд появляется.
kotkovets
09-03-2012, 14:34
wolkow70, Это нормально, пробуйте так, более надежно и быстрее.
FindWindow вызывается в каждом цикле 50 раз с задержкой 2мс, при найденном окне - прерывание цикла.
!macro CloseProgram NameProgramm
${For} $1 1 50
FindWindow $0 "${NameProgramm}"
${If} $0 != 0
MessageBox MB_OK "Окошко -${NameProgramm}-" IDOK
System::Call "user32::PostMessage(ir0,i${WM_CLOSE},i0,i0)"
${Break}
${EndIf}
Sleep 2
${Next}
!macroend
Function CloseProgram
System::Store S
!insertmacro CloseProgram "IEFrame"
!insertmacro CloseProgram "OperaWindowClass"
!insertmacro CloseProgram "MozillaWindowClass"
System::Store L
FunctionEnd
т.е при не найденных окнах - окошко установщика появится где то через 300 мс (если сообщение убрать)
При желании оттачивания надежности, время задержки можно увеличить и количество вызовов FindWindow
wolkow70
09-03-2012, 14:54
kotkovets,
Насколько подобная процедура применима к процессу деинсталляции программы? То есть, при удалении программы тоже надо закрывать браузеры.
wolkow70
09-03-2012, 15:21
kotkovets,
В последнем варианте Mozilla не гасится. В предложенном ранее варианте закрывалась надежно.
kotkovets
09-03-2012, 15:32
В последнем варианте Mozilla не гасится. В предложенном ранее варианте закрывалась надежно. »
Потому что, у браузера куча окон (скрытых, дочерних, модальных), - Почему-то окно Mozilla три раза подряд появляется
Второй вариант предназначен на одно окно.
кстати во 2 варианте попробуйте убрать макрос - ${Break}
Насколько подобная процедура применима к процессу деинсталляции программы? То есть, при удалении программы тоже надо закрывать браузеры. »
Насколько оно Вам надо то, не забудьте в деинсталляторе вызов функции через приставку - un
wolkow70
09-03-2012, 16:05
кстати во 2 варианте попробуйте убрать макрос - ${Break} »
Не помогает.
Вернулся к первоначальному варианту. Надежно закрывает пять запущенных копий Мозиллы (больше копий запускать не пробовал :)).
wolkow70
10-03-2012, 10:32
Не могу решить одну задачку. Нужно внести при установке программы регистрационные данные из рег-файла.
На 32-битной системе все получается. На 64-битной чего только не шаманил, данные вносятся, но только в раздел HKLM32, а нужно в HKLM64
В скрипте так:
IfFileExists "$EXEDIR\reg.reg" 0 Done
${If} ${RunningX64}
execwait '$windir\SysWOW64\regedit.exe /s "$EXEDIR\reg.reg"'
${Else}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
${EndIf}
Done:
В рег-файле:
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Ashampoo\Ashampoo UnInstaller 4]
"HLRegKEY"="xxxxxxx-xxxxxxx-xxxxxxxx"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC