.: NSIS - все вопросы :. часть 2.

Ответить
 • Просмотры: 28
Аватара пользователя
Kopejkin

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Kopejkin »

Цитата K.A.V.:



Смотря какой функционал вы подразумеваете под словом "бэкап", судя по вашему коду бэкап для вас - просто переименование папки
.: NSIS - все вопросы :. часть 2.




Даже простое переименование папки не срабатывает... А как по другому можно создать бэкап?


Цитата K.A.V.:



И зачем 2 раза указывается команда SetShellVarContext all?
.: NSIS - все вопросы :. часть 2.




Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя...
Аватара пользователя
Kopejkin

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Kopejkin »

Цитата Dodakaedr:



А как по другому можно создать бэкап?
.: NSIS - все вопросы :. часть 2.




эм...ну, типа, можно тупо копировать файлы, можно архивировать папку в архив...




Цитата Dodakaedr:



Думал так правильнее, в скрипте папки и в общем профиле и в профиле пользователя...
.: NSIS - все вопросы :. часть 2.




Изображение везде воткнём, на всякий случай

А протестировать скрипт из 5 строк - занятие для неудачников, ага? Изображение



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

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MaGoth »

Цитата K.A.V.:



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




Это я понял еще с предыдущего вашего ответа. А как удалить папку только в том случае если она пустая?

Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r?
Аватара пользователя
MaGoth

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MaGoth »

Цитата Dodakaedr:



Если правильно понял то RMDir $APPDATA\MyFolder без ключа /r?
.: NSIS - все вопросы :. часть 2.




Да



Могу ещё такой код подкинуть, может, пригодится в работе (взят с офф. справки), по проверке содержимого директории, есть в ней файлы или нет:



Код:

Код: Выделить всё

!include "FileFunc.nsh" 
outfile test.exe
Section
  ${DirState} "$EXEDIR\2" $0
;    $0=0  (пустая)
;    $0=1  (с файлами)
;    $0=-1 (папка не существует) 
  MessageBox MB_OK|MB_ICONINFORMATION "$0"
SectionEnd
Вложения
TEST_Txt.rar
(576 байт) 0 скачиваний
TEST_Txt.rar
(576 байт) 0 скачиваний
Аватара пользователя
Kopejkin

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Kopejkin »

Цитата:



Функция .onInit выполняется после инициализации инсталлятора. Это самая первая функция, которая выполняется при запуске вашего инсталлятора



А какая самая последняя функция при закрытии инсталлятора?
Аватара пользователя
MaGoth

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MaGoth »

Цитата Dodakaedr:



А какая самая последняя функция при закрытии инсталлятора?
.: NSIS - все вопросы :. часть 2.






Код:

Код: Выделить всё

Function .onInstSuccess
 MessageBox MB_OK "Установка успешно завершена!" 
FunctionEnd

или при отмене установки:



Код:

Код: Выделить всё

Function .onUserAbort
 MessageBox MB_OK "отмена успешно завершена!"
FunctionEnd

при классическом интерфейсе.



в модерне функция "зашита" в константу



Код:

Код: Выделить всё

!define MUI_CUSTOMFUNCTION_ABORT "Моя_функция"

подробности в справке
Аватара пользователя
Kopejkin

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Kopejkin »

Если речь идёт о инсталляторе с графическим интерфейсом, то последняя функция, которая будет выполнена - функция с именем .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 (закрытие инсталлятора)
Аватара пользователя
MaGoth

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MaGoth »

Не могу решить проблему. При использовании

Код:

Код: Выделить всё

SetOutPath "$APPDATA\Color\Licenses\EQ"
File "License.license"

не хочет удалять папку $APPDATA\Color при завершении скрипта, если без файла то все отлично работает, но без файла никак. Думал через последнею функцию провести удаление, но тоже безрезультатно.


Цитата K.A.V.:



Если речь идёт о silent архиве без графического интерфейса в коде изначально - то там вы уже сами можете определить, какую функцию выполнять последней перед командой quit (закрытие инсталлятора)
.: NSIS - все вопросы :. часть 2.




Вот такой способ и используется (SilentInstall silent), удаление прописано как раз перед quit, но не удаляет. В чем может быть конфликт?
Аватара пользователя
Flix

Re: .: NSIS - все вопросы :. часть 2.

Сообщение Flix »

Вы уж меня простите, если обижу, но это похоже на какой-то троллинг, либо вы сами себя запутали и ничего не поняли из наших ранних сообщений



1. Вы предоставляете код из двух строк, который распаковывает какой-то файл "License.license"

2. Вы тут же пишите, что не можете удалить папку "$APPDATA\Color" с файлами, хотя пустая папка удаляется, ранее шел разговор про команду RMDir, которую вы якобы поняли, как использовать

3. Вы удаляете папку "$APPDATA\Color" командой RMDir без ключа /r, в которой есть файлы, хотя вроде бы знаете, что команда RMDir без ключа /r не удаляет папки с файлами



И если хотите, чтобы вам реально помогли - предоставляйте полный код с проблемным функционалом, а не какой-то бесполезный отгрызок из пары строк




Цитата Dodakaedr:



Вот такой способ и используется (SilentInstall silent), удаление прописано как раз перед quit, но не удаляет. В чем может быть конфликт?
.: NSIS - все вопросы :. часть 2.




Да нет разницы, в каком месте кода будет прописано удаление файлов, главное, чтобы эти файлы не были заняты сторонними процессами
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Цитата K.A.V.:



Да нет разницы, в каком месте кода будет прописано удаление файлов, главное, чтобы эти файлы не были заняты сторонними процессами
.: NSIS - все вопросы :. часть 2.




Ну скорее всего инсталлятор и есть тот самый процесс


Код

[spoiler]Код:
[/spoiler]

Код: Выделить всё

;---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







Проблема в этом куске(не работает):


Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

SetShellVarContext all
RMDir /r "$APPDATA\Color"
IfFileExists "$APPDATA\Color_Backup" 0 
Rename "$APPDATA\Color_Backup" "$APPDATA\Color"
Ответить

Вернуться в «Автоматическая установка приложений»