PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 [81] 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

Dodakaedr
04-05-2015, 20:47
Смотря какой функционал вы подразумеваете под словом "бэкап", судя по вашему коду бэкап для вас - просто переименование папки »
Даже простое переименование папки не срабатывает... А как по другому можно создать бэкап?
И зачем 2 раза указывается команда SetShellVarContext all? »
Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя...

K.A.V.
04-05-2015, 21:09
А как по другому можно создать бэкап? »
эм...ну, типа, можно тупо копировать файлы, можно архивировать папку в архив...

Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя... »
:lamer: везде воткнём, на всякий случай
А протестировать скрипт из 5 строк - занятие для неудачников, ага? :)

При указании команды SetShellVarContext all, переменные с путями будут ссылаться на общие папки до тех пор, пока вы не пропишите в коде SetShellVarContext current

Dodakaedr
04-05-2015, 21:17
При указании команды SetShellVarContext all, переменные с путями будут ссылаться на общие папки до тех пор, пока вы не пропишите в коде SetShellVarContext current »
Это я понял еще с предыдущего вашего ответа. А как удалить папку только в том случае если она пустая?
Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r?

K.A.V.
04-05-2015, 22:27
Если правильно понял то 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 "Моя_функция"
подробности в справке

K.A.V.
05-05-2015, 14:07
Если речь идёт о инсталляторе с графическим интерфейсом, то последняя функция, которая будет выполнена - функция с именем .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, но не удаляет. В чем может быть конфликт?

K.A.V.
05-05-2015, 16:34
Вы уж меня простите, если обижу, но это похоже на какой-то троллинг, либо вы сами себя запутали и ничего не поняли из наших ранних сообщений

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"

K.A.V.
05-05-2015, 21:06
Проблема в этом куске(не работает): » :)

Ещё раз откройте наш справочник и внимательно прочитайте каждое слово на страничке описания команды 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"Есть другие способы как вшить файл в инстал, и при запуске помещать в нужное место?

K.A.V.
05-05-2015, 22:57
Типа такого? »
ога :)

Пишет что удалило но не удаляет. »
Так у вас команда на отображение сообщения с текстом "Папка удалена" стоит раньше, чем вы проверяете существования папки ;-)
Так сделайте и не покажет сообщение, если папка не удалится
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 например :(

K.A.V.
09-05-2015, 19:00
Processfunc.nsh имеет недостаток »
Думаю, это не проблема хидера Processfunc, если у пользователя нет прав администратора - то и многих привилегий у него нет, в том числе и читать системные процессы
А вы хотели получить полные права в ограниченной учетной записи?

Serg866
10-05-2015, 16:54
New VCL Style for NSIS »
А для 3.0 такого оформления нет?


И ещё ребят кто знает как сделать цифровую подпись инсталятору на НСИС? А то Гугль Хром блокирует мою программу из за того что она ехешник! Типа может нанести вред компьютеру!

K.A.V.
10-05-2015, 19:47
И ещё ребят кто знает как сделать цифровую подпись »
Её сначала нужно приобрести за денюжку, если не ошибаюсь, а потом уже думать над вшиванием

Хром блокирует мою программу из за того что она ехешник! »
Так запакуйте EXE в zip архив и распространяйте в архиве, в чем проблема?




© OSzone.net 2001-2012