Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


Сообщения: 1216
Благодарности: 486


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

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

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 

Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


MKN, Та функция вполне рабочая, хотя и перемудрена немного. Но применяемый там метод записи ломает хард/софт-линки

Вот так можно построить обработку конструкциями в стиле LogicLib:
Код: Выделить весь код
ShowInstDetails show
RequestExecutionLevel user
InstallColors /windows

!include FileFunc.nsh
!include LogicLib.nsh
!include Util.nsh

            
            
хтонь, на которой всё это работает
; String begins with !macro _[== _a _b _t _f !insertmacro _LOGICLIB_TEMP StrLen $_LOGICLIB_TEMP `${_b}` StrCpy $_LOGICLIB_TEMP `${_a}` $_LOGICLIB_TEMP StrCmp `$_LOGICLIB_TEMP` `${_b}` `${_t}` `${_f}` !macroend ; String ends with !macro _]== _a _b _t _f !insertmacro _LOGICLIB_TEMP StrLen $_LOGICLIB_TEMP `${_b}` StrCpy $_LOGICLIB_TEMP `${_a}` '' -$_LOGICLIB_TEMP StrCmp `$_LOGICLIB_TEMP` `${_b}` `${_t}` `${_f}` !macroend ; String includes !macro _*== _a _b _t _f !insertmacro _LOGICLIB_TEMP System::Call 'shlwapi.dll::StrStrI(ts, ts)p.s' `${_a}` `${_b}` Pop $_LOGICLIB_TEMP StrCmp $_LOGICLIB_TEMP 0 `${_f}` `${_t}` !macroend !define PathSplitPN `!insertmacro PathSplitPN ` !macro PathSplitPN outParent outName Path !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${Path}` ${CallArtificialFunction} PathSplitPN_ Pop ${outName} Pop ${outParent} !verbose pop !macroend !macro PathSplitPN_ !verbose push !verbose ${_FILEFUNC_VERBOSE} Exch $0 Push $1 Push $2 StrCpy $1 $0 1 -1 StrCmp $1 '\' 0 +3 StrCpy $0 $0 -1 Goto -3 StrLen $2 $0 IntOp $2 $2 - 1 StrCpy $1 $0 1 $2 StrCmp $1 '\' +2 StrCmp $1 '' 0 -3 StrCpy $1 $0 $2 ; path IntOp $2 $2 + 1 StrCpy $0 $0 '' $2 ; name Pop $2 Exch $1 Exch Exch $0 !verbose pop !macroend !define FileGetTempCopy `!insertmacro FileGetTempCopy ` !macro FileGetTempCopy outDuplicateName FullFileName !verbose push !verbose ${_FILEFUNC_VERBOSE} Push `${FullFileName}` Exch $0 ; [in] FullFileName / [out] outDuplicateName Push $1 ; file path Push $2 ; name / handle Push $3 ; outDuplicateName ${PathSplitPN} $1 $2 $0 System::Call 'kernel32::GetTempFileName(tr1, tr2, i0, t.r3)i.r2' ${If} $2 != 0 FileClose $2 SetDetailsPrint none CopyFiles /silent $0 $3 SetDetailsPrint lastused ${IfNot} ${Errors} StrCpy $0 $3 ${Else} StrCpy $0 '' SetDetailsPrint none Delete $3 SetDetailsPrint lastused ${EndIf} ${Else} StrCpy $0 '' ${EndIf} Pop $3 Pop $2 Pop $1 Exch $0 Pop ${outDuplicateName} !verbose pop !macroend !define FileReadByLine `!insertmacro _FileReadByLine '' ` !define FileReadByLineUTF16LE `!insertmacro _FileReadByLine UTF16LE ` !macro _FileReadByLine ENCODING LineNumberVar LineVar ReadFile WriteFile !verbose push !verbose ${LOGICLIB_VERBOSITY} !insertmacro _PushScope FileProcessByLine _FileProcessByLine.${__COUNTER__} !insertmacro _PushScope FileProcessByLineLineVar ${LineVar} !insertmacro _PushScope FileProcessByLineENCODING '${ENCODING}' !insertmacro _PushScope FileProcessByLineReadFile '${ReadFile}' !insertmacro _PushScope FileProcessByLineWriteFile '${WriteFile}' !ifndef _FileProcessByLine_Initialize_Variables !define _FileProcessByLine_Initialize_Variables Var /GLOBAL _FileProcessByLine_Var_RD Var /GLOBAL _FileProcessByLine_Var_RDHANDLE Var /GLOBAL _FileProcessByLine_Var_WR Var /GLOBAL _FileProcessByLine_Var_LINE Var /GLOBAL _FileProcessByLine_Var_LINENUMBER !else !define ${_FileProcessByLine}__Save_Vars Push $_FileProcessByLine_Var_RD Push $_FileProcessByLine_Var_RDHANDLE Push $_FileProcessByLine_Var_WR Push $_FileProcessByLine_Var_LINE Push $_FileProcessByLine_Var_LINENUMBER !endif GetFullPathName $_FileProcessByLine_Var_RD `${ReadFile}` ${IfNotThen} ${FileExists} $_FileProcessByLine_Var_RD ${|} Goto ${_FileProcessByLine}__errors ${|} ${If} `${_FileProcessByLineWriteFile}` == `` ${OrIf} `${_FileProcessByLineWriteFile}` == `${_FileProcessByLineReadFile}` StrCpy $_FileProcessByLine_Var_WR $_FileProcessByLine_Var_RD ${FileGetTempCopy} $_FileProcessByLine_Var_RD $_FileProcessByLine_Var_WR ${IfThen} $_FileProcessByLine_Var_RD == '' ${|} Goto ${_FileProcessByLine}__errors ${|} ${Else} StrCpy $_FileProcessByLine_Var_RD `${ReadFile}` StrCpy $_FileProcessByLine_Var_WR `${WriteFile}` ${EndIf} ClearErrors FileOpen $_FileProcessByLine_Var_RDHANDLE $_FileProcessByLine_Var_RD r ${If} ${Errors} Goto ${_FileProcessByLine}__errors ${EndIf} FileOpen $_FileProcessByLine_Var_WR $_FileProcessByLine_Var_WR w ${If} ${Errors} FileClose $_FileProcessByLine_Var_RDHANDLE Goto ${_FileProcessByLine}__errors ${EndIf} StrCpy $_FileProcessByLine_Var_LINENUMBER 0 ${Do} FileRead${ENCODING} $_FileProcessByLine_Var_RDHANDLE $_FileProcessByLine_Var_LINE ${IfThen} ${Errors} ${|} ${ExitDo} ${|} !define ${_FileProcessByLine}__LineNumberVar=${LineNumberVar} !ifdef ${_FileProcessByLine}__LineNumberVar= | ${_FileProcessByLine}__LineNumberVar=- !else IntOp $_FileProcessByLine_Var_LINENUMBER $_FileProcessByLine_Var_LINENUMBER + 1 StrCpy ${LineNumberVar} $_FileProcessByLine_Var_LINENUMBER !endif !undef ${_FileProcessByLine}__LineNumberVar=${LineNumberVar} StrCpy ${LineVar} $_FileProcessByLine_Var_LINE ; ............... !verbose pop !macroend !define FileWriteByLine `!insertmacro _FileWriteByLine "" ` !define FileWriteByLineUTF16LE `!insertmacro _FileWriteByLine UTF16LE ` !macro _FileWriteByLine ENCODING !verbose push !verbose ${LOGICLIB_VERBOSITY} !ifndef _FileProcessByLine !error "Cannot use FileProcessByLineEnd${ENCODING} without a preceding FileProcessByLine${ENCODING}" !endif ; ............... FileWrite${ENCODING} $_FileProcessByLine_Var_WR ${_FileProcessByLineLineVar} ${Loop} FileClose $_FileProcessByLine_Var_RDHANDLE FileClose $_FileProcessByLine_Var_WR ${_FileProcessByLine}__errors: SetErrors ${If} `${_FileProcessByLineWriteFile}` == `` ${OrIf} `${_FileProcessByLineWriteFile}` == `${_FileProcessByLineReadFile}` SetDetailsPrint none Delete $_FileProcessByLine_Var_RD SetDetailsPrint lastused ${EndIf} !ifdef ${_FileProcessByLine}__Save_Vars !undef ${_FileProcessByLine}__Save_Vars Pop $_FileProcessByLine_Var_LINENUMBER Pop $_FileProcessByLine_Var_LINE Pop $_FileProcessByLine_Var_WR Pop $_FileProcessByLine_Var_RDHANDLE Pop $_FileProcessByLine_Var_RD !endif !insertmacro _PopScope FileProcessByLine !insertmacro _PopScope FileProcessByLineLineVar !insertmacro _PopScope FileProcessByLineENCODING !insertmacro _PopScope FileProcessByLineReadFile !insertmacro _PopScope FileProcessByLineWriteFile !macroend
Section TEST SetDetailsPrint none CopyFiles /silent '${__FILE__}' '${__FILE__}-1.txt' CopyFiles /silent '${__FILE__}' '${__FILE__}-2INPLACE.txt' CopyFiles /silent '${__FILE__}' '${__FILE__}-3.txt' SetDetailsPrint lastused /* вместо иснструкции: ${FileReadByLine} LineNumber Line FileToRead FileToWrite LineNumber - переменная с номером строки или '' или '-' (не использовать) Line - переменная со строкой (включает символы конца строки) FileToRead - файл для чтения FileToWrite - файл для записи Если FileToWrite=='' или FileToWrite==FileToRead, будет изменён фходной файл Внутри цикла ${FileReadByLine} .... ${Continue} завершит работу с текущей строкой, пропустит запись и перейдёт к чтению следующей строки ${Break} прекратит обработку .... ${FileWriteByLine} ${FileReadByLine} / ${FileReadByLineUTF16LE} - читать как ANSI / UTF16-LE ${FileWriteByLine} / ${FileWriteByLineUTF16LE} - писать как ANSI / UTF16-LE */ ; пронумерует строки: ${FileReadByLine} $0 $1 '${__FILE__}-1.txt' '${__FILE__}-1NUMBERS.txt' IntFmt $0 '%4d' $0 StrCpy $1 '[$0] $1' ${FileWriteByLineUTF16LE} ; сохранить в кодировке UTF16LE ; оставит и пронумерует только нечётные строки: ${FileReadByLine} $0 $1 '${__FILE__}-1.txt' '${__FILE__}-1ODDS.txt' IntOp $2 $0 % 2 ${IfThen} $2 == 0 ${|} ${Continue} ${|} IntFmt $0 '%4d' $0 StrCpy $1 '[$0] $1' ${FileWriteByLine} ; удалит пустые строки, измениы ыходной файл: ${FileReadByLine} - $1 '${__FILE__}-2INPLACE.txt' '' ${IfThen} $1 == '$\r$\n' ${|} ${Continue} ${|} ; обработка прекратится на следующей строке: ${IfThen} $1 *== '; break on this line' ${|} ${Break} ${|} ${FileWriteByLine} ; вложенный цикл ${FileReadByLine} - $1 '${__FILE__}-1.txt' '' ${If} $1 [== 'Section ' ${FileReadByLine} $0 $1 '${__FILE__}-3.txt' '${__FILE__}-3BLOCKS.txt' ${If} $1 [== '!macro ' ${OrIf} $1 [== 'Function ' ${OrIf} $1 [== 'Section ' IntFmt $0 '%4d' $0 StrCpy $1 '[$0] $1' ${Else} ${Continue} ${EndIf} ${FileWriteByLine} ${Break} ; завершить обработку ${EndIf} ${FileWriteByLine} SectionEnd
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:17, 04-11-2023 | #2831



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


iglezz, спасибо !, но очень мудрёно... Наивный практический вопрос - как выглядит то запрос на замену ? Скажем, входной файл In.txt , строка для замены №7, заменить на содержимое из $data.
ps Можно ли оформить функцию как .nsh ? (чтобы не очень пугала... )

Отправлено: 09:31, 04-11-2023 | #2832


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


Цитата MKN:
Скажем, входной файл In.txt , строка для замены №7, заменить на содержимое из $data. »
Просто заменить седьмую строку на $data:
Код: Выделить весь код
${FileReadByLine} $0 $1 'In.txt' ''
  ${IfThen} $0 == 7 ${|} StrCpy $1 $data ${|}
${FileWriteByLine}
Цитата MKN:
Можно ли оформить функцию как .nsh ? »
Не можно, а нужно.
В примере оно из разных nsh подёргано.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:54, 04-11-2023 | #2833

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


iglezz,
Почему то после замены строки, следующая строка, имеющаяся в файле "прилепляется" к концу заменённой, т.е. после строки замены отсутствует перенос строки... Можно конечно после Line добавить $\r$\n, а может лучше в код функции добавить перенос, куда следует добавить ?
И можно ли в ${FileReadByLine} $0 $1 использовать свои переменные(вместо $0 $1) ?

Последний раз редактировалось MKN, 04-11-2023 в 13:15.


Отправлено: 12:07, 04-11-2023 | #2834


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


Цитата MKN:
Почему то после замены строки, следующая строка, имеющаяся в файле "прилепляется" к концу заменённой, т.е. после строки замены отсутствует перенос строки... Можно конечно после Line добавить $\r$\n, а может лучше в код функции добавить перенос, куда следует добавить ? »
Как и в инструкциях NSIS FileRead/FileReadUTF16LE строка (в пределах NSIS_MAX_STRLEN) считывается с символами завершения строки. Добавлять их обработку в макрос большого смысла нет, т.к. это замедлит и без того небыстрый код, а нужно не всегда.
Можно просто добавлять $\r$\n к переменной Line, если нет желания использовать EOL-символы для конкретной обрабатываемой строки.
Цитата MKN:
И можно ли в ${FileReadByLine} $0 $1 использовать свои переменные(вместо $0 $1) ? »
Можно любые.

Тут, кстати, надо учитывать, что на строках длиннее NSIS_MAX_STRLEN работа может быть некоректной.
Для таких случаев нужна отдельная версия этой конструкции, в которой побочно и EOL-символы получатся в отдельной переменной.

Отправлено: 14:42, 04-11-2023 | #2835


Аватара для AlekseyPopovv

Старожил


Сообщения: 169
Благодарности: 6

Профиль | Отправить PM | Цитировать


В файле длинная строка, в ней нужно найти такие данные:
Код: Выделить весь код
"download":{"default_directory":"C:\Пользователи\Downloads"}
Путь разный у всех.
Надо заменить на:
Код: Выделить весь код
"download":{"default_directory":"$EXEDIR\${DEFDIR}\Downloads"}
Как это сделать по проще, если можно?

Отправлено: 07:51, 01-12-2023 | #2836

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Подскажите пожалуйста - как приспособить RegistryFunc.nsh (из Справочника) для работы с UNICODE версиями NSIS ?
К сожалению сказано, что "библиотека полностью совместима только ANSI версией компилятора NSIS"...

Отправлено: 16:25, 17-12-2023 | #2837


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


MKN,
Посмотрев код по диагонали, могу сказать, что потребуется вдумчиво прогнать всё через дебаггер в голове на предмет выявления мест, где идёт работа на уровне байт, а не символов.
Параллельно можно и оптимизировать немного на производительность.

Отправлено: 17:16, 17-12-2023 | #2838

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Цитата iglezz:
потребуется вдумчиво прогнать всё через дебаггер в голове на предмет выявления мест, где идёт работа на уровне байт, а не символов. Параллельно можно и оптимизировать немного на производительность. »
Вся надежда на тебя...

Отправлено: 18:41, 17-12-2023 | #2839


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


MKN, Большого смысла адаптировать RegistryFunc.nsh не вижу, проще новый написать с нуля.

Отправлено: 01:44, 18-12-2023 | #2840



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 dimadr Наборы обновлений для Windows XP/2003/Windows 7 267 14-02-2020 08:25
[архив].: NSIS - все вопросы :. kotkovets Автоматическая установка приложений 3387 09-12-2012 11:56
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1491 22-07-2011 22:42
Выбор|модернизация процессора .:[все вопросы]:. Часть I Myxa Выбор отдельных компонентов компьютера и конфигурации в целом 1845 01-01-2011 19:18
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход