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

Компьютерный форум 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

 

Пользователь


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

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


icq99999999,
перед созданием ярлыка, нужно создать папку ярлыка, иначе ярлык может не создаваться:
CreateDirectory "$SMPROGRAMS\mod"
CreateShortCut "$SMPROGRAMS\mod\mod.lnk" "$INSTDIR\mod.exe"

Цитата icq99999999:
а так нет?
RMDir /r /REBOOTOK "$SMPROGRAMS\mod" »
потому что должно быть так:
SetOutPath "$SMPROGRAMS\"
RMDir /r /REBOOTOK "$SMPROGRAMS\mod"

Цитата icq99999999:
пишу
CreateShortCut "$SMPROGRAMS\очистка.lnk" "$INSTDIR\mod.exe" "/O"
получаю ярлык с таким именем
Тихая.lnk"
в чём причина? »
если ты создаешь Unicode установщик, то файл скрипта должен быть в формате UTF-16LE, если ANSI, то ANSI
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:39, 25-10-2013 | #641



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

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


Аватара для icq99999999

Пользователь


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

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


нужно распознать значение из ini
то есть в ini в секции Setting параметр (I)D будет значение например $EXEDIR
вытяну значение
ReadINIStr $1 "$INSTDIR\mod.ini" "Setting" "(I)D"
но в переменную $1 будет скопировано сам текст $EXEDIR
а мне нужно чтоб а но распознавалось и вместо текста $EXEDIR был путь exe
ну то есть

PHP код: Выделить весь код

!include "FileFunc.nsh"

SetCompressor /SOLID lzma

OutFile 
"e.exe"
SilentInstall silent

Section 
"MainSection" SEC01
 ReadINIStr 
$"$exeDIR\mod.ini" "Setting" "(I)D"
  
MessageBox MB_OK "вы запустили exe из $1"
SectionEnd 

как итог будет сообщение с текстом "вы запустили exe из $EXEDIR"
а мне нужно чтоб был путь exe то есть например сообщение с текстом: "вы запустили exe из С:\1.exe"

Последний раз редактировалось icq99999999, 25-10-2013 в 11:37.


Отправлено: 11:20, 25-10-2013 | #642


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


icq99999999, не знаете команду сравнения строк?
Прочтите сначала Справочник по NSIS

Код: Выделить весь код
Section "MainSection" SEC01
 ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D"
StrCmp $1 "$$EXEDIR" 0 +2
  MessageBox MB_OK "вы запустили exe из $EXEDIR"
SectionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

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

Отправлено: 11:53, 25-10-2013 | #643


Аватара для alexfinik

Новый участник


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

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


K.A.V., Первую часть читал. Сидел ночью часа полтора и построчно "проходил" код, записывал как изменяются переменные. Забавно. Как ни странно Код заработал с первого раза после проверки. Выложу ради интереса кусок. Правда "завести" массивы так и не вышло. Пока не разобрался почему, но, в любом случае, массивы тут нафиг не нужны оказались/

Код: Выделить весь код
Function nsRkeeperIni
	;!insertmacro var_message
	${if} $NumCash > 0	
		Goto CreateTest0
	${endif}
	${IpPortMid_ar->Init}
	${MID_ar->Init}
	${RefServerMid_ar->Init}
	${IPMidSrv_ar->Init}
	${Station_ar->Init}
	StrCpy $ini ".ini"
	StrCpy $R6 "1"
	StrCpy $R7 "1"
	;!insertmacro var_message
	StrCpy $NumMid "4"
StartTest0:	
	StrCpy $NumMidFlag "1" ;флаг входа в цикл NumMid
	nsDialogs::Create 1018
	Pop $Dialog
	${If} $Dialog == error
		Abort
	${EndIf}
	
	${NSD_CreateLabel} 0 0 100% 12u "Создаем Rkeeper.ini - Введите параметры ресторана ниже"
	Pop $Label1
	${NSD_CreateLabel} 0 13u 100% 12u "Имя кассового сервера:"
	Pop $Label2
	${NSD_CreateText} 0 25u 100% 13u "TEST_MIDSERVER" ;задаем имя клиента
	Pop $MID
	
	${NSD_CreateLabel} 0 38u 100% 12u "Кассовый сервер подсоединяестся к серверу:"
	Pop $Label3
	${NSD_CreateText} 0 50u 100% 13u "TEST_RK7SRV" ;задаем имя сервера к которому подсоединяемся 
	Pop $RefServerMid
	
	${NSD_CreateLabel} 0 63u 100% 12u "IP-адрес и порт"
	Pop $Label4
	${NSD_CreateText} 0 75u 100% 13u "127.0.0.1:3669" ;
	Pop $IpPortMid
	
	${NSD_CreateLabel} 0 88u 100% 12u "Количество касс на данном кассовом сервере (1..50)"
	Pop $Label25
	${NSD_CreateText} 0 100u 100% 13u "1" ;
	Pop $NumCash
	;IntOp $R5 $NumCash -1
	;MessageBox MB_OK "NumCash=$NumCash $\n MID=$MID $\n IpPortMid=$IpPortMid"
	;!insertmacro var_message
	;Задаем количество касс на кассовом сервере
	;StrCpy $Num1 $NumCash ;зачем-то надо копировать. С Numcash не работает
	nsDialogs::Show
	
	${if} $R6 <= $NumMid
	${andif} $NumCash == 0
		Goto FinishTest0	
	${endif}
	
	
	
CreateTest0:
	${if} $NumCash > 0	
		nsDialogs::Create 1018
		Pop $Dialog
		${If} $Dialog == error
			Abort
		${EndIf}
		${NSD_CreateLabel} 0 0 100% 12u "Создаем wincash.ini - введите параметры кассовой станции"
		Pop $Label8
		${NSD_CreateLabel} 0 13u 100% 12u "Имя кассовой станции:"
		Pop $Label9
		${NSD_CreateText} 0 25u 100% 13u "TEST_ST01" ;задаем имя кассовой станции
		Pop $Station
		${NSD_CreateLabel} 0 38u 100% 12u "IP-адрес кассового сервера:"
		Pop $Label10
		${NSD_CreateText} 0 50u 100% 13u "127.0.0.1" ;
		Pop $IPMidSrv		
		StrCpy $NumCashFlag "1" ;флаг разрешения входа в цикл NumCash
	${endif}
	nsDialogs::Show
	IntOp $NumCash $NumCash - 1
	;MessageBox MB_OK "Уменьшаю NumCash на 1 $\n Теперь NumCash=$NumCash"
FinishTest0:
	${If} $NumCash == 0
		IntOp $R6 $R6 + 1
		;MessageBox MB_OK "Увеличиваю R6 на 1 $\n Теперь R6=$R6 $\n NumCash=$NumCash"
		StrCpy $NumCashFlag "0" ;флаг запрета входа в цикл NumCash
	${endif}
	${if} $NumCash > 0
		Goto CreateTest0
	${endif}
	${If} $R6 <= $NumMid
	;${andif} $NumCash > 0
		Goto StartTest0
	${endif}

FunctionEnd
;работа с массивами тут необходима
Function nsRkeeperIniLeave
  ${if} $NumMidFlag == 1	
	${NSD_GetText} $NumCash $NumCash
	${NSD_GetText} $MID $MID
	${NSD_GetText} $RefServerMid $RefServerMid
	${NSD_GetText} $IpPortMid $IpPortMid
	;${NSD_GetText} $Num1 $Num1
	
	${MID_ar->Write} $R6 "$MID"
	${MID_ar->Read} $R2 $R6
	${RefServerMid_ar->Write} $R6 "$RefServerMid"
	${RefServerMid_ar->Read} $R3 $R6
	${IpPortMid_ar->Write} $R6 "$IpPortMid"
	${IpPortMid_ar->Read} $R4 $R6
	!insertmacro var_message
	!insertmacro MakeRkeeperIni
	StrCpy $NumMidFlag "0" ;флаг выхода в цикл NumMid
	StrCpy $NumCashFlag "0" ;флаг запрета входа в цикл NumCash - в принципе тут лишний
  ${endif}	
  
  
  ${if} $NumCashFlag == 0
  ${orif} $NumCashFlag == ""
	Goto FinishTest1
  ${endif}
  
	${if} $NumCash < 1
	${OrIf} $NumCash > 50
		;MessageBox MB_OK "Задано слишком маленькое или большое количество станций $\n либо задано некорректное NumCash=$NumCash $\n $\n R6<NumCash ($R6<$NumCash) $\n Перезапустите инсталлятор"
	${else}
		;MessageBox MB_OK "На кассовой станции №$R6 $NumCash станций $\n R7=$R7"
		${NSD_GetText} $Station $Station
		;${NSD_GetText} $RefServer2 $RefServer2
		${NSD_GetText} $IPMidSrv $IPMidSrv
		
		${Station_ar->Write} $R7 "$Station"
		${Station_ar->Read} $2 $R7
		${IPMidSrv_ar->Write} $R7 "$IPMidSrv"
		${IPMidSrv_ar->Read} $3 $R7
		${NSD_GetText} $2 $2
		${NSD_GetText} $3 $3
		!insertmacro var_message	
		!insertmacro WinCashIniBat
		
		IntOp $R7 $R7 + 1
	${endif}
	/*
	${if} $NumCash
	
	
	
	${if} $R6 < $NumMid
		Goto FinishTest1
	${endif}
	*/
;;Íå îáÿçàòåëüíî, íî åñëè çàäàòü áóäåò êîííåêòèòüñÿ áûñòðåå, òî æå äëÿ êàññû
;;Èíîãäà íåîáõîäèìî (åñëè íå ïðîõîäÿò broadcast ñîîáùåíèÿ)
;;TEST_RK7SRV=127.0.0.1:3669


	;MessageBox MB_OK "Внизу Numcash=$Numcash"
	/*
	*/
FinishTest1:
FunctionEnd

Форум читал - Ну страниц 50-80, наверное. Интересно. Не помню, кажется первую часть читал. Некоторые вещи просто сносят крышу и вызывают вопросы "как это работает??", но практически для меня неважны были всё равно.

KAV, жалко ваших потраченных усилий, когда сам разобрался... Но спасибо. У вас способ короче намного, конечно. Пока в код досконально не всматривался. Но я так понимаю, что вы предлагаете перехватить управление кнопкой Next. На будущее возьму на заметку.

Цитата:
Вопрос: для чего вам 2-ая функция в странице?
В макросах вставленных с длинными именами типа rkeeperini и wincashinibat создаются ини-файлы. А в первой функции они задаются. Нерационально вышло грешу этим, но вышло. Чай, прошли времени 3.5" и 5" дискет, чтобы заморачиваться размером кода Офигенно доволен! Отказался от циклов по совету kotkovets в пользу GoTo (по совету KAV).

-------
Спасибо за помощь!


Отправлено: 13:21, 25-10-2013 | #644


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата alexfinik:
KAV, жалко ваших потраченных усилий, когда сам разобрался... »
Да ничего страшного, мы здесь чтобы помогать начинающим кодерам, а т.к. видно, что вы сами стараетесь, то лично я вдвойне охотнее помогаю таким как вы
Ну, а то, что сами разобрались - это тоже хорошо, голова работает логически, в программировании это очень важно

Цитата alexfinik:
У вас способ короче намного, конечно. »
С опытом и у вас будут коды короче, главное не лениться и побольше тестировать команды и разные конструкции возможностей NSIS

Цитата alexfinik:
Но я так понимаю, что вы предлагаете перехватить управление кнопкой Next. На будущее возьму на заметку. »
WinMessage.nsh посмотрите в папке Include, там много интересных команд на управление элементов интерфейса на будущее найдёте для себя

Цитата alexfinik:
Офигенно доволен! »
Мы рады, что смогли помочь
Если будут вопросы или проблемы с кодом, спрашивайте, не стесняйтесь

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 13:39, 25-10-2013 | #645


Аватара для alexfinik

Новый участник


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

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


icq99999999, Вот с таким mod.ini всё работает

Код: Выделить весь код
[Setting]
(U)F=Example1
I(D)=Example2
(J)G=Example3

[NETKERN]
;возможные протоколы - nbhdup.dll, SPXSOC.dll
Protocols=.\TCPSOC.dll

[TCPSOC]
LISTEN=0

[TCPDNS]
Цитата K.A.V.:
WinMessage.nsh посмотрите в папке Include, там много интересных команд на управление элементов интерфейса на будущее найдёте для себя »
О да, уже оценил какая красота есть внутри *.nsh.

-------
Спасибо за помощь!


Отправлено: 13:43, 25-10-2013 | #646


Аватара для icq99999999

Пользователь


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

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


Цитата K.A.V.:
Код: »
а если в переменную $1 будет скопировано значение которое придёт в голову пользователя например значение будет "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
то есть с начало копирую в переменную
ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D"
потом
MessageBox MB_OK "$1"
как итог будет
сообщение с текстом "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
нужно
сообщение с текстом: "C:\Program Files\не известное значение пришедшее в голову пользователя"

Отправлено: 14:27, 25-10-2013 | #647


Аватара для kotkovets

Ветеран


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

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


Цитата icq99999999:
сообщение с текстом "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
нужно
сообщение с текстом: "C:\Program Files\не известное значение пришедшее в голову пользователя" »
мозги, как говорят, подключи:
Код: Выделить весь код
MessageBox MB_OK "$PROGRAMFILES\$1"

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


Отправлено: 14:32, 25-10-2013 | #648


Аватара для icq99999999

Пользователь


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

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


Цитата kotkovets:
Код: »
не знаю пробую объяснит сначала
подхватываю значение
ReadINIStr $0 "$1\mod.ini" "Setting" "(I)Vers"
значение это путь установки который должен показаться в сообщении пользователю
MessageBox MB_OK "$1"
если в ini написано(притом может быть любая переменная nsis($SMPROGRAMS,$APPDATA итд) "$PROGRAMFILES\любой путь"
то нужно определить эту переменную и (любой путь) и отправить в сообщении пользователю
то есть например значение в ini
$PROGRAMFILES\Portable
то определить и отправить сообщение "C:\Program Files\Portable"
если любая друга переменная пример
$APPDATA\имя придуманное пользователем
то определить и отправить сообщение "C:\Users\%username%\AppData\Roaming\имя придуманное пользователем"

Последний раз редактировалось icq99999999, 25-10-2013 в 15:07.


Отправлено: 15:00, 25-10-2013 | #649


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата icq99999999:
притом может быть любая переменная nsis($SMPROGRAMS,$APPDATA итд) "$PROGRAMFILES\любой путь" »
Справочник по NSIS => Примеры кодов => Работа со строками => StrRep
Делайте по принципу замены всех возможных переменных в прочитываемой строке, пример:

Код: Выделить весь код
${StrRep} $1 "$1" "$$EXEDIR" "$EXEDIR"
${StrRep} $1 "$1" "$$PROGRAMFILES" "$PROGRAMFILES"
И т.д. со всеми переменными

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

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

Отправлено: 15:13, 25-10-2013 | #650



Компьютерный форум 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




 
Переход