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

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

Закрытая тема
Настройки темы
[архив].: NSIS - все вопросы :.

Аватара для kotkovets

Ветеран


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


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

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


Изменения
Автор: volk1234
Дата: 09-12-2012
Описание: перевод темы в архив.
Тема закрыта!
Лимит страниц.
Продолжение тут:
.: NSIS - все вопросы :. часть 2.
Старая шапка:
читать дальше »

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

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


Текущая версия: 2.46 от 6 декабря 2009 года
Скачать | Архив сборок версии 2 | Архив сборок версии 1

ВНИМАНИЕ! Созданный в NSIS инсталлятор является ANSI-приложением. Есть возможность использовать UNICODE-сборку системы, но при этом ваши дистрибутивы не будут работать в ANSI-системах, таких, как Windows 9x. Для загрузки UNICODE-сборки системы посетите сайт: http://www.scratchpaper.com/

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

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

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

Плагины и полезности к NSIS: http://nsis.sourceforge.net/Category:Plugins

Интерфейс Venis GUI: http://www.spaceblue.com/products/venis
Интерфейс ExperienceUI GUI http://experienceui.xx0r.info/oldeng...erienceui/home
Пример:


Интерфейс SkinCrafter Plugin - http://www.skincrafter.com/
Пример:

Инструкция по использованию от K.A.V.

Примеры скриптов на нашем форуме
Скрипт 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, если хотите скрыть некоторые файлы в вашей инсталляции.


===========
тема прикрепляется, шапка будет дорабатыватся... Volk1234, hb860

Отправлено: 23:35, 17-06-2006

 

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


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

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


Опять по той же задаче пишу... Пытался разобраться, но из-за плохих знаний ничего не получается.
Смотрел пример, но как реализовать до конца не понял



Вот такое пытался писать..

Код: Выделить весь код
Section
SetOutPath "$INSTDIR"
;нужен поиск по файлу 1.cfg на предмет наличия записи "aaaaaaaaaaaaaa.*=$INSTDIR\xxx\yyy". Если запись есть, ничего делать не нужно.
StrCpy $0 0
  loop:
  ReadINIStr $1 "$INSTDIR\1.cfg" "main" "aaaaaaaaaaaaaa" 
  StrCmp $1 "" Done
  StrCmp $1 "xxx\yyy" 0 +3
  StrCpy $0 1
  Goto Done
  IntOp $0 $0 + 1
  Goto Loop
 Done:
  StrCmp $0 1 Next
  ; если записи нет, то нужно ее вставить "aaaaaaaaaaaaaa.*=$INSTDIR\xxx\yyy", где * - порядковый номер. 
GetFullPathName $6 ..
${FileReadFromEnd} "$INSTDIR\1.cfg" "Find" ;читает строку за строкой? и записывает в $9?
WriteINIStr $INSTDIR\1.cfg main "aaaaaaaaaaaaaa.$3" "$6\xxx\yyy"
 Next:
SectionEnd
 
Function Find
  StrCpy $2 $9 14 ;Эту строку нужно обрезать до 14 первых символов (SimObjectPaths)
  ${if} $2 == "aaaaaaaaaaaaaa"
  Intop $3 $3 + 1
  ${endif}
FunctionEnd

Отправлено: 12:00, 13-01-2012 | #2211



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

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


Аватара для kotkovets

Ветеран


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

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


romgun, я же говорил в цикле читаем файл,в функции макроса значения совпадений уничтожается, поэтому для подсчёта объявляем свою переменную:
Код: Выделить весь код
Var int
Пример файла:
Код: Выделить весь код
[setup]
Name=app.exe
[dir]
Dirpatch_1=C:\
Dirpatch_2=D:\
Dirpatch_3=E:\
Пример:
Код: Выделить весь код
Section
StrCpy $int 0

${FileReadFromEnd} "$InstDir\file.cfg" "Read"
${if} ${Errors}
   MessageBox mb_ok "файл не найден"
${Else}
  ${For} $0 1 $int
      ReadIniStr $1 "$InstDir\file.cfg"  "dir" "Dirpatch_$0"
   MessageBox mb_ok "$1"
  ${Next}
${EndIf}
SectionEnd

Function Read
  StrCpy $R0 $9 9
  ${If} $R0 == "Dirpatch_"
    InTop $int $int + 1
 
    MessageBox mb_ok "$R0 - $int"
  ${EndIf}
  Push $0 
FunctionEnd

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


Последний раз редактировалось kotkovets, 15-01-2012 в 23:34.

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

Отправлено: 20:15, 13-01-2012 | #2212

yyv yyv вне форума

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


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

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


делаю свою страничку UNPAGE_CONFIRM для деинсталятора
подскажите как получить папку из какой был запущен деинсталятор?


$EXEDIR и $EXEPATH не подходят

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

C:\Program Files\uninstal\
C:\Documents and Settings\Admin\Рабочий стол\

используя же $EXEDIR я всегда получаю :
C:\WINDOWS\Temp\~nsu.tmp

up $OUTDIR - решает мою проблему

Отправлено: 15:48, 17-01-2012 | #2213

yyv yyv вне форума

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


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

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


возвращаясь к старому вопросу

можно ли изменить внешний вид PAGE_INSTFILES
точнее UNPAGE_INSTFILES. но я думаю нет особых различий.
пробовал вызывать функции SHOW PRE
что-то типа
Код: Выделить весь код
  
nsDialogs::Create 1018   
  Pop $5 
     ${NSD_CreateLabel} 120u 10u 195u 40u "dialog create function"
  Pop $R4  
   SetCtlColors $R4 "" "FFFFE1"     nsDialogs::Show

но это не дает желаемого эффекта
Я получаю пустую страничку с одним лейблом без остальных контролов.

как можно (если можно) добавить собственные контролы?

И при этом что бы остались старые контролы и выполнялся код в секциях. (те что бы прогрес бар также адекватно на это реагировал)

Отправлено: 17:12, 17-01-2012 | #2214


Аватара для kotkovets

Ветеран


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

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


текущая папка деинсталлятора - $INSTDIR
Деинсталлятор имеет два процесса - $EXEDIR, для того, чтобы удалить деинсталлятор.

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


Отправлено: 17:20, 17-01-2012 | #2215


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


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

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


Есть текстовый файл (list.txt). В нем находиться список файлов(а точнее пути к ним), которые требуется удалить. Задача стоит в том, что бы написать код деинсталятора, короый удаляет эти файлы.

Я пробовал так:

Код: Выделить весь код
    
    ${LineSum} "$INSTDIR\list.txt" $NumOfFiles ;узнаем кол-во файлов, и значение заносим в $NumOfFiles
    
    ${For} $CurrentFileNumber 1 $NumOfFiles
        ${LineRead} "$INSTDIR\list.txt" $CurrentFileNumber $CurrentFileName ; в цикле for читаем построчно файл "list.txt" и значение (путь к файлу) заносим в $CurrentFileName
        Delete "$CurrentFileName" ;удаляем файл по его пути.
    ${Next}
Ничего не получается. Удаляется лишь тот фал, что был последним в списке.

Последний раз редактировалось Paval, 17-01-2012 в 18:58.


Отправлено: 18:14, 17-01-2012 | #2216


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


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

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


Надеюсь на помощь...
Структура нужна примерно такая: проверка1---проверка2---если нет данных, то запись---копирование новых файлов
Пытался делать кусками, но теперь проблема объединить.
С логикой беда - если значение не найдено, из цикла выползти не могу (разве что через ${LoopUntil} - см. в первом куске)

1 этап Проверка была ли уже установка. Желательно двумя способами - по cfg и по xml , которые могут быть либо в папке юзера, либо в папке All users
Проблема с циклом и переходом к анализу xml?

читать дальше »

Код: Выделить весь код
; поиск в cfg
Section
;если установлено для текущего пользователя
ClearErrors
IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles
StrCpy $0 0
${Do}
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${If} $1 == "SimObjects\UT2 Aircraft"
    MessageBox mb_ok "найден в юзерпапке"
	${ExitDo}
	${EndIf}
	InTop $0 $0 + 1
	${LoopUntil} $0 == '50'  ;??????
	Goto end
;если установлено для всех
	NotFiles:
ClearErrors
SetShellVarContext all
StrCpy $0 0
${Do}
ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
${If} $1 == "SimObjects\UT2 Aircraft"
    MessageBox mb_ok "найден в allusers"
	${ExitDo}
	${EndIf}
	InTop $0 $0 + 1
	${LoopUntil} $0 == '50'  ;??????
	end:
SectionEnd

; поиск в xml
 Section
 ;если установлено для текущего пользователя
 ClearErrors
 StrCpy $0 0
 IfFileExists "$APPDATA\Microsoft\FSX\exe.xml" 0 NotFiles
 ${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
  	loop1:
	${xml::FindNextElement} "Name" $0 $1
	${xml::GetText} $1 $2
	${If} $1 == "UT2"
    MessageBox MB_OK "$1 найден"
	Goto end
	${EndIf} 
	Goto loop1
	${xml::FindCloseElement}
	${xml::Unload}	
NotFiles:
ClearErrors
;если установлено для всех
SetShellVarContext all
StrCpy $0 0
    ${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
  	loop:
	${xml::FindNextElement} "Name" $0 $1
	${xml::GetText} $1 $2
	${If} $1 == "UT2"
    MessageBox MB_OK "$1 найден"
	Goto end
	${EndIf} 
	Goto loop
	${xml::FindCloseElement}
	${xml::Unload}	
	end:
SectionEnd


2. Если в cfg не найдено, запись туда.
Слишком, по-моему, путано написано
читать дальше »

Код: Выделить весь код
Function Read
  StrCpy $R0 $9 15
  ${If} $R0 == "SimObjectPaths."
    InTop $int $int + 1
  ${EndIf}
  Push $0
FunctionEnd

Section
;если установлено для текущего пользователя
 IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles
 StrCpy $int 0
${FileReadFromEnd} "$APPDATA\Microsoft\FSX\fsx.cfg" "Read"
${if} ${Errors}
  MessageBox mb_ok "CFG файл не найден"
${Else}
  ${For} $0 1 $int
     ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
    ${Next}
${EndIf}
  InTop $0 $0 - 1
  WriteINIStr "$APPDATA\Microsoft\FSX\fsx.cfg" main "SimObjectPaths.$0" "SimObjects\UT2 Aircraft"
 Goto Done
NotFiles:
; если установлено в папку для всех пользователей
 SetShellVarContext all
 IfFileExists "$APPDATA\Microsoft\FSX\fsx.cfg" 0 NotFiles2
 StrCpy $int 0
${FileReadFromEnd} "$APPDATA\Microsoft\FSX\fsx.cfg" "Read"
${if} ${Errors}
  MessageBox mb_ok "CFG файл не найден"
${Else}
  ${For} $0 1 $int
     ReadINIStr $1 "$APPDATA\Microsoft\FSX\fsx.cfg" "main" "SimObjectPaths.$0"
  ${Next}
${EndIf}
  InTop $0 $0 - 1
  WriteINIStr "$APPDATA\Microsoft\FSX\fsx.cfg" main "SimObjectPaths.$0" "SimObjects\UT2 Aircraft"
 Goto Done
 NotFiles2:
 MessageBox MB_OK "CFG файл не найден"
Done:
SectionEnd


3. если в xml не найдено, запись туда

читать дальше »


Код: Выделить весь код
Section 
SetOutPath "$INSTDIR"
GetFullPathName $ID ..
    ${xml::LoadFile} "$APPDATA\Microsoft\FSX\exe.xml" $0
	${xml::GotoPath} "/SimBase.Document" $0
  	${xml::CreateNode} <Launch.Addon></Launch.Addon> $1
	${xml::InsertEndChild} "$1" $0
	${xml::CreateNode} <Disabled>False</Disabled> $1
	${xml::InsertEndChild} "$1" $0
	${xml::CreateNode} <ManualLoad>False</ManualLoad> $2
	${xml::InsertAfterNode} "$2" $1
	${xml::CreateNode} <Name>UT2</Name> $3
	${xml::InsertAfterNode} "$3" $2
	${xml::CreateNode} '<Path>$ID\Flight One Software\Ultimate Traffic 2\UT2Services.exe</Path>' $4
	${xml::InsertAfterNode} "$4" $3
	${xml::CreateNode} <NewConsole>True</NewConsole> $5
	${xml::InsertAfterNode} "$5" $4
	${xml::SaveFile} "$APPDATA\Microsoft\FSX\test_sааaved.xml" $0
    ${xml::Unload} ; unload plugin
SectionEnd


4. Переименование и копирование папок. Здесь в принципе все ясно

Последний раз редактировалось romgun, 19-01-2012 в 09:48.


Отправлено: 14:14, 18-01-2012 | #2217


Аватара для SamLab

Ветеран


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

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


Вопросик по переменным системной папки винды

$SYSDIR в системе x86 и x64 ведет в System32

поэтому для помещения файлов в x64 системе в папку SysWOW64 приходится указывать $WINDIR\SysWOW64

может есть способ для оригинального установщика, дабы при определении системы как x86 файлы в System32 кидались, а в x64 в SysWOW64?


пока вот так делаю:
${If} ${SectionIsSelected} ${secX86install} ;
SetOutPath "$WINDIR\SysWOW64"
File "C:\x86.url"
${Else}
${EndIf}
${If} $R1 == "64" ;
SetOutPath "$WINDIR\System32\"
File "C:\x64.url"
${Else}
${EndIf}

но так в системе x86 файлы будут в SysWOW64 вместо System32 кидаться...

-------
SamLab.ws - Программы и русификаторы + SamForum.org - Софтовый форум + Новые драйверы

Свобода — это когда забываешь отчество у тирана © Бродский


Отправлено: 14:49, 18-01-2012 | #2218


Аватара для Krinkels

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


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

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


SamLab
Подобный вопрос уже проскальзывал, нужно просто проверять версию системы( х86 или х64 ) и в зависимости от результата выбирать ту или иную папку.

-------
Рок моя честь, а моя честь моя жизнь. krinkels.org


Отправлено: 15:04, 18-01-2012 | #2219


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


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

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


Есть каталог. В нем подкаталоги. Некоторые из них пустые. Как их удалить (только пустые)?

Отправлено: 15:17, 18-01-2012 | #2220



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Мультимедиа - WinAmp .:[ обсуждение всех версий ]:. ssaram Программное обеспечение Windows 406 12-02-2022 19:45
WinstyleMonitor .:[все вопросы]:. Mr dUSHA Проект WinStyle 331 12-02-2014 13:15
Delphi - Delphi .: [все вопросы] :. Serega Программирование и базы данных 94 04-05-2013 18:45
Доступ - Никак не удаляются файлы (AVI и все остальные форматы) .:[все вопросы]:. Microsoft Windows 2000/XP 105 30-06-2010 11:58
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход