Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Dodakaedr
04-05-2015, 20:47
Смотря какой функционал вы подразумеваете под словом "бэкап", судя по вашему коду бэкап для вас - просто переименование папки »
Даже простое переименование папки не срабатывает... А как по другому можно создать бэкап?
И зачем 2 раза указывается команда SetShellVarContext all? »
Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя...
А как по другому можно создать бэкап? »
эм...ну, типа, можно тупо копировать файлы, можно архивировать папку в архив...
Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя... »
:lamer: везде воткнём, на всякий случай
А протестировать скрипт из 5 строк - занятие для неудачников, ага? :)
При указании команды SetShellVarContext all, переменные с путями будут ссылаться на общие папки до тех пор, пока вы не пропишите в коде SetShellVarContext current
Dodakaedr
04-05-2015, 21:17
При указании команды SetShellVarContext all, переменные с путями будут ссылаться на общие папки до тех пор, пока вы не пропишите в коде SetShellVarContext current »
Это я понял еще с предыдущего вашего ответа. А как удалить папку только в том случае если она пустая?
Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r?
Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r? »
Да
Могу ещё такой код подкинуть, может, пригодится в работе (взят с офф. справки), по проверке содержимого директории, есть в ней файлы или нет:
!include "FileFunc.nsh"
outfile test.exe
Section
${DirState} "$EXEDIR\2" $0
; $0=0 (пустая)
; $0=1 (с файлами)
; $0=-1 (папка не существует)
MessageBox MB_OK|MB_ICONINFORMATION "$0"
SectionEnd
Dodakaedr
04-05-2015, 23:21
Функция .onInit выполняется после инициализации инсталлятора. Это самая первая функция, которая выполняется при запуске вашего инсталлятора
А какая самая последняя функция при закрытии инсталлятора?
kotkovets
05-05-2015, 11:10
А какая самая последняя функция при закрытии инсталлятора? »
Function .onInstSuccess
MessageBox MB_OK "Установка успешно завершена!"
FunctionEnd
или при отмене установки:
Function .onUserAbort
MessageBox MB_OK "отмена успешно завершена!"
FunctionEnd
при классическом интерфейсе.
в модерне функция "зашита" в константу
!define MUI_CUSTOMFUNCTION_ABORT "Моя_функция"
подробности в справке
Если речь идёт о инсталляторе с графическим интерфейсом, то последняя функция, которая будет выполнена - функция с именем .onGUIEnd, она будет выполнена в любом случае и всегда самой последней, если, конечно, инсталлер закрывается штатно без краша и убития процесса, и если процесс установки не запущен с ключом /S (тихая установка)
Function .onGUIEnd
MessageBox MB_OK|MB_ICONINFORMATION ".onGUIEnd"
FunctionEnd
Если речь идёт о инсталляторе с графическим интерфейсом, который запущен с ключом "/S" (тихая установка без графического интерфейса), то последней функцией, которая будет выполнена - будет функция .onInstSuccess
Можно поступить разными способами, тут только вопрос о том, какой функционал вам нужен и зачем вам последняя выполняемая функция
Можете прописать команды в .onInstSuccess - будет выполняться всегда при всех условиях, только посмотрите сами, как она будет отрабабывать
Можете добавить в эту функцию проверку на запуск с ключом "/S", чтобы, например, всегда выполнялась .onGUIEnd даже при тихой установки:
Function .onInstSuccess
# MessageBox MB_OK ".onInstSuccess"
${GetParameters} $R0
${GetOptions} "$R0" "/S" $R0
IfErrors +2 0
call .onGUIEnd
FunctionEnd
Function .onGUIEnd
MessageBox MB_OK|MB_ICONINFORMATION ".onGUIEnd"
FunctionEnd
Для использования в коде команд из примера, нужно прописать в начале кода !include "FileFunc.nsh"
В общем, тестируйте, смотрите, что вам больше подходит
Если речь идёт о silent архиве без графического интерфейса в коде изначально - то там вы уже сами можете определить, какую функцию выполнять последней перед командой quit (закрытие инсталлятора)
Dodakaedr
05-05-2015, 16:00
Не могу решить проблему. При использовании
SetOutPath "$APPDATA\Color\Licenses\EQ"
File "License.license"
не хочет удалять папку $APPDATA\Color при завершении скрипта, если без файла то все отлично работает, но без файла никак. Думал через последнею функцию провести удаление, но тоже безрезультатно.
Если речь идёт о silent архиве без графического интерфейса в коде изначально - то там вы уже сами можете определить, какую функцию выполнять последней перед командой quit (закрытие инсталлятора) »
Вот такой способ и используется (SilentInstall silent), удаление прописано как раз перед quit, но не удаляет. В чем может быть конфликт?
Вы уж меня простите, если обижу, но это похоже на какой-то троллинг, либо вы сами себя запутали и ничего не поняли из наших ранних сообщений
1. Вы предоставляете код из двух строк, который распаковывает какой-то файл "License.license"
2. Вы тут же пишите, что не можете удалить папку "$APPDATA\Color" с файлами, хотя пустая папка удаляется, ранее шел разговор про команду RMDir, которую вы якобы поняли, как использовать
3. Вы удаляете папку "$APPDATA\Color" командой RMDir без ключа /r, в которой есть файлы, хотя вроде бы знаете, что команда RMDir без ключа /r не удаляет папки с файлами
И если хотите, чтобы вам реально помогли - предоставляйте полный код с проблемным функционалом, а не какой-то бесполезный отгрызок из пары строк
Вот такой способ и используется (SilentInstall silent), удаление прописано как раз перед quit, но не удаляет. В чем может быть конфликт? »
Да нет разницы, в каком месте кода будет прописано удаление файлов, главное, чтобы эти файлы не были заняты сторонними процессами
Dodakaedr
05-05-2015, 16:56
Да нет разницы, в каком месте кода будет прописано удаление файлов, главное, чтобы эти файлы не были заняты сторонними процессами »
Ну скорее всего инсталлятор и есть тот самый процесс ;---Definitions----
!define SNAME "EQPortable"
; Best Compression
SetCompress Auto
SetCompressor /SOLID lzma
SetCompressorDictSize 32
SetDatablockOptimize On
;----Includes----
!include "ProcessFunc.nsh"
;!include "FileFunc.nsh"
;-----Runtime switches----
CRCCheck off
AutoCloseWindow false
SilentInstall silent
WindowIcon off
;-----Set basic information-----
Name "${SNAME}"
Caption "${SNAME}"
OutFile "..\${SNAME}.exe"
;-----Version Information------
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
VIProductVersion "1.0.6.0"
VIAddVersionKey ProductName "EQ Portable"
VIAddVersionKey FileDescription "EQPortable"
Section "Main"
${If} ${ProcessExists} "eq.exe"
MessageBox MB_ICONINFORMATION|MB_OK "Программа уже запущена!"
Quit
${Else}
SetShellVarContext current
IfFileExists "$APPDATA\Color\EQ" 0
Rename "$APPDATA\Color" "$APPDATA\Color_Backup"
IfFileExists "$EXEDIR\Data" 0
CopyFiles "$EXEDIR\Data\*.*" "$APPDATA\Color\EQ"
SetShellVarContext all
IfFileExists "$APPDATA\Color\Licenses\EQ" 0
Rename "$APPDATA\Color" "$APPDATA\Color_Backup"
SetOutPath "$APPDATA\Color\Licenses\EQ"
File "License.license"
ExecWait "$EXEDIR\EQ\EQ.exe"
Sleep 400
SetShellVarContext current
CopyFiles "$APPDATA\Color\EQ\*.*" "$EXEDIR\Data"
Sleep 800
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color_Backup" 0
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
SetShellVarContext all
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color_Backup" 0
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
quit
${EndIf}
SectionEnd
;Function .onInstSuccess
;SetShellVarContext all
;RMDir /r "$APPDATA\Color"
;IfFileExists "$APPDATA\Color_Backup" 0
;Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
;FunctionEnd
Проблема в этом куске(не работает):
SetShellVarContext all
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color_Backup" 0
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
Проблема в этом куске(не работает): » :)
Ещё раз откройте наш справочник и внимательно прочитайте каждое слово на страничке описания команды IfFileExists, ибо если вы в таком же духе "продолжите изучать NSIS" - сомневаюсь, что лично мне хватит терпения постоянно цитировать содержание страничек справочника персонально для вас в этой теме. Были в этой теме уже личности, которые не желали читать справочник, когда им говорили об этом раз 10 подряд, и вообще во что-то вникать для создания своего кода не хотели, а хотели только готовый код видеть в этой теме. Вы вроде бы что-то пытаетесь сами сделать, ладно, посмотрим :)
Ну скорее всего инсталлятор и есть тот самый процесс »
Нет, если он не запущен из той папки, которую вы хотите удалить
Ваш кусок кода настолько простой, что "не работать" он может только из-за внешних проблем: отсутствия файлов или занятость их другими приложениями
Иногда, например, не удаляются директории (уже не помню при каких случаях)
Сделайте после каждой команды переименования/удаления паузу командой показа сообщения
MessageBox MB_OK|MB_ICONINFORMATION "test"
и наблюдайте пошагово, как ваш скрипт отрабатывает, удаляя/перемещая файлы, и, думаю, найдёте ошибку, в чем она таится я сказать не могу по коду - вроде всё правильно, за исключением команды IfFileExists, но в таком виде, в каком вы её указали - она вообще погоды в скрипте не меняет, её как-будто там нет :)
Dodakaedr
05-05-2015, 21:31
и наблюдайте пошагово, как ваш скрипт отрабатывает, удаляя/перемещая файлы, и, думаю, найдёте ошибку, »
Я писал что если прицепить файл, то папка не удаляется, если без файла то все норм.
Сделайте после каждой команды переименования/удаления паузу командой показа сообщения »
Типа такого? SetShellVarContext all
RMDir /r "$APPDATA\Color"
MessageBox MB_OK "Папка удалена"
IfFileExists "$APPDATA\Color_Backup" 0 NotFiles
MessageBox MB_OK "Папка есть"
Goto Done
NotFiles:
MessageBox MB_OK "Папки нет"
Done:
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
MessageBox MB_OK "Папка переименована"
Пишет что удалило но не удаляет.
Ваш кусок кода настолько простой, что "не работать" он может только из-за внешних проблем: отсутствия файлов »
А если только две пустые папки?
Dodakaedr
05-05-2015, 22:13
Как показывают тесты вся проблема в команде SetOutPath "$APPDATA\Color\Licenses\EQ"
File "License.license"Есть другие способы как вшить файл в инстал, и при запуске помещать в нужное место?
Типа такого? »
ога :)
Пишет что удалило но не удаляет. »
Так у вас команда на отображение сообщения с текстом "Папка удалена" стоит раньше, чем вы проверяете существования папки ;-)
Так сделайте и не покажет сообщение, если папка не удалится
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color" +2 0
MessageBox MB_OK "Папка удалена"
А если только две пустые папки? »
Если в папке есть ещё одна папка, пусть даже пустая, то RMDir без ключа /r не удалит папку, без ключа удаляются пустые папки, которые в себе не имеют ни одного объекта
Как показывают тесты вся проблема в команде »
хм, ну, не знаю, у вас после отработки скрипта остаётся одна папка EQ с этим файлом в этой папке и не удаляется даже командой RMDir с ключом /r?
Есть другие способы как вшить файл в инстал, и при запуске помещать в нужное место? »
Распаковать во временную папку и потом скопировать файл, но какая разница то? Если файл чем-то блочится - ищите виновника, можете попробовать переименовать файл перед удалением, хотя, из имени файла файла если посмотреть - так это просто какой-то файл лицензии для программки, сомневаюсь, что такие файлы лочатся проводником или программой, хотя кто их знает...
Dodakaedr
06-05-2015, 19:06
Так сделайте и не покажет сообщение, если папка не удалится »
Так и есть.
хм, ну, не знаю, у вас после отработки скрипта остаётся одна папка EQ с этим файлом в этой папке и не удаляется даже командой RMDir с ключом /r? »
Удаляется только файл лицензии, а папки нет.
Если файл чем-то блочится - ищите виновника »
Думаю сам инстал и есть виновник, только как это исправить... .
можете попробовать переименовать файл перед удалением »
Файл поддается под переименование и удаление во время работы инстала. Файл не причем.
Dodakaedr
06-05-2015, 19:24
Распаковать во временную папку и потом скопировать файл »
Проверил такой способ и сработало, спасибо!
Limonica
09-05-2015, 09:57
Processfunc.nsh имеет недостаток. Если запускать инсталляционый пакет без административных прав, то он не находит процессы которые запущены с повышенными правами, SYSTEM например :(
Processfunc.nsh имеет недостаток »
Думаю, это не проблема хидера Processfunc, если у пользователя нет прав администратора - то и многих привилегий у него нет, в том числе и читать системные процессы
А вы хотели получить полные права в ограниченной учетной записи?
New VCL Style for NSIS »
А для 3.0 такого оформления нет?
И ещё ребят кто знает как сделать цифровую подпись инсталятору на НСИС? А то Гугль Хром блокирует мою программу из за того что она ехешник! Типа может нанести вред компьютеру!
И ещё ребят кто знает как сделать цифровую подпись »
Её сначала нужно приобрести за денюжку, если не ошибаюсь, а потом уже думать над вшиванием
Хром блокирует мою программу из за того что она ехешник! »
Так запакуйте EXE в zip архив и распространяйте в архиве, в чем проблема?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.