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

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

 

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


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

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


Вот спасибо. Пол дня пытался понять, что не так. Я и подозревал, что что то считывается невидимое, потому что, если напрямую присваивал любые одинаковые значения, то было всё правильно.
Начну знакомство с очисткой.

P.S. Я так понял, что нельзя в моём конкретном примере обойтись как нибудь без $\n и неизвестной для меня очистки? Ведь будет только одна строка.

Отправлено: 23:28, 07-04-2023 | #2711



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

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


Старожил


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

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


Самый простой способ хранения значений в файле - использовать ini-файл (ReadINIStr/WriteINIStr)
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:35, 07-04-2023 | #2712


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


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

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


Попробую.

Добавлено:

Всё получилось и работает как надо. Это я так хочу использовать "уникальную метку" системы. Но не уверен, что данные, те что я использую будут уникальными для всех систем:

Код: Выделить весь код
    StrCpy $R6 "c:\"
    System::Call 'Kernel32::GetVolumeInformation(t "$R6",t.r3,i ${NSIS_MAX_STRLEN},*i,*i,*i.r1,t.r2,i ${NSIS_MAX_STRLEN})i.r0'
В связи с этим еще один вопрос, откуда в системе виндовс можно взять "метку", чтобы на 100 процентов или почти на 100 процентов эти данные были "уникальными" для каждой системы?

Последний раз редактировалось inco1, 08-04-2023 в 07:03.


Отправлено: 23:39, 07-04-2023 | #2713

MKN MKN вне форума

Ветеран


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

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


Цитата inco1:
откуда в системе виндовс можно взять "метку", чтобы на 100 процентов или почти на 100 процентов эти данные были "уникальными" для каждой системы? »
Кроме ID винта, используют MAC сетевухи, время создания системных каталогов или всё это в совокупности + иногда математика с этими данными...
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:24, 08-04-2023 | #2714


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


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

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


MKN, приветствую.
Как записать ID винта? Или ID винта это его серийный номер?

Отправлено: 09:37, 08-04-2023 | #2715

MKN MKN вне форума

Ветеран


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

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


Вложения
Тип файла: 7z HddInfo.7z
(3.0 Kb, 5 просмотров)

inco1,

есть миниатюрный плагин для определения инфы о HDD (см. прикреплённый файл)

или

Цитата:
OutFile "GetVolumeInformation.exe"
; под серийным номером подразумевается "Volume ID"
var ser
var ser1
var disk

!define GetVolumeInformation "Kernel32::GetVolumeInformation(t,t,i,*i,*i,*i,t,i) i"

Section
; определяем системный диск
StrCpy $disk $windir
StrCpy $disk $windir 3
MessageBox MB_OK $disk

System::Call '${GetVolumeInformation} ("$disk",,${NSIS_MAX_STRLEN},.r0,,,,${NSIS_MAX_STRLEN})'
IntFmt $ser "%08X" $0 ; из цифрового - HEX

; стандартное представление: 4 символа-4символа
StrCpy $ser1 $ser 4 ; берём первые 4 символа
StrCpy $ser $ser "" 4 ; отсекаем первые 4 символа
StrCpy $ser "$ser1-$ser"
MessageBox MB_OK "VolumeID $ser"
SectionEnd

Последний раз редактировалось MKN, 08-04-2023 в 12:47. Причина: й файл)

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

Отправлено: 12:04, 08-04-2023 | #2716


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


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

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


iglezz, Доброго вам дня и здоровья.

Походу в вашем коде поиска строки баг. Вчера целый день потратил, чтобы найти проблему. Я то ведь сразу вставлял ваш код в мой огромный код и строку не искало. А экзешник с одного вашего кода четко и быстро находит. Я потом давай убирать с моего кода по строкам всё, пока не нашел причину.

Вот экзешник с вашим кодом, который прекрасно находит слово "Word.com" в файле hosts:

Код: Выделить весь код
RequestExecutionLevel user
               SilentInstall silent 

                !include Util.nsh
                !include LogicLib.nsh
                !include StrFunc.nsh
                ${Using:StrFunc} StrLoc

!define FileReadAuto `!insertmacro FileReadAuto`
!macro FileReadAuto ISUTF16LE HANDLE READLINE
    StrCmp ${ISUTF16LE} 0 0 +3
    FileRead ${HANDLE} ${READLINE}
    Goto +2
    FileReadUTF16LE ${HANDLE} ${READLINE}
!macroend

!define FileFindStrStruct `(i, i, &t${NSIS_MAX_STRLEN}) p`
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0
    Exch
    Exch $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7

    StrCpy $5 0
    StrCpy $7 0

    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end

    FileReadWord $2 $4
    ${If} $4 = 0xFEFF
        StrCpy $3 1
    ${Else}
        StrCpy $3 0
    ${EndIf}
    FileSeek $2 0 SET

    ${Do} 
        ${FileReadAuto} $3 $2 $4
        ${IfThen} ${Errors} ${|} ${ExitDo} ${|}

        IntOp $5 $5 + 1

        ${StrLoc} $6 $4 $1 >
        ${If} $6 != ''
            System::Call '*${FileFindStrStruct} (r5, r6, r4) .r7'
            ${ExitDo}
        ${EndIf}
    ${Loop}
    FileClose $2

    FileFindStr_macro_end:
    StrCpy $0 $7

    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Exch $0
!macroend


Section

    ${FileFindStr} $0 '$SYSDIR\drivers\etc\hosts' 'Word.com'
    ${If} $0 <> 0
           MessageBox MB_OK "        Нужное слово найдено "
    ${Else}
           MessageBox MB_OK "      Нужное слово НЕ найдено "
    ${EndIf}

SectionEnd
А вот в код добавлена функция с двумя строчками и он перестал искать.

Код: Выделить весь код
RequestExecutionLevel user
               SilentInstall silent 

                !include Util.nsh
                !include LogicLib.nsh
                !include StrFunc.nsh
                ${Using:StrFunc} StrLoc

!define FileReadAuto `!insertmacro FileReadAuto`
!macro FileReadAuto ISUTF16LE HANDLE READLINE
    StrCmp ${ISUTF16LE} 0 0 +3
    FileRead ${HANDLE} ${READLINE}
    Goto +2
    FileReadUTF16LE ${HANDLE} ${READLINE}
!macroend

!define FileFindStrStruct `(i, i, &t${NSIS_MAX_STRLEN}) p`
!define FileFindStr `!insertmacro FileFindStr`
!macro FileFindStr OUTPUT FILENAME STRTOFIND
    Push '${STRTOFIND}'
    Push '${FILENAME}'
    ${CallArtificialFunction} FileFindStr_macro
    Pop ${OUTPUT}
!macroend
!macro FileFindStr_macro
    Exch $0
    Exch
    Exch $1
    Push $2
    Push $3
    Push $4
    Push $5
    Push $6
    Push $7

    StrCpy $5 0
    StrCpy $7 0

    FileOpen $2 $0 R
    IfErrors FileFindStr_macro_end

    FileReadWord $2 $4
    ${If} $4 = 0xFEFF
        StrCpy $3 1
    ${Else}
        StrCpy $3 0
    ${EndIf}
    FileSeek $2 0 SET

    ${Do} 
        ${FileReadAuto} $3 $2 $4
        ${IfThen} ${Errors} ${|} ${ExitDo} ${|}

        IntOp $5 $5 + 1

        ${StrLoc} $6 $4 $1 >
        ${If} $6 != ''
            System::Call '*${FileFindStrStruct} (r5, r6, r4) .r7'
            ${ExitDo}
        ${EndIf}
    ${Loop}
    FileClose $2

    FileFindStr_macro_end:
    StrCpy $0 $7

    Pop $7
    Pop $6
    Pop $5
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Exch $0
!macroend


Section

    ${FileFindStr} $0 '$SYSDIR\drivers\etc\hosts' 'Word.com'
    ${If} $0 <> 0
           MessageBox MB_OK "        Нужное слово найдено "
    ${Else}
           MessageBox MB_OK "      Нужное слово НЕ найдено "
    ${EndIf}

SectionEnd


Function .onInit

Var /GLOBAL Proga

        ReadRegStr $Proga HKLM "SOFTWARE\Test" "Test"

FunctionEnd

Отправлено: 14:46, 09-04-2023 | #2717


Старожил


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

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


inco1, да, в nsis вечно забываю сбрасывать error флаг
в макросе FileFindStr_macro перед
Код: Выделить весь код
FileOpen $2 $0 R
надо добавить
Код: Выделить весь код
ClearErrors

Отправлено: 15:22, 09-04-2023 | #2718


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


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

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


iglezz,

Теперь заработало, как надо. Спасибо за оперативный отклик.

P.S. Сравнивал скорость поиска по ${LineRead} и вашим кодом. Брал 400 строк и нужная вконце, одна строка - одно слово. Ваш код находит мгновенно, а через ${LineRead} около 8-10 секунд.

Отправлено: 15:44, 09-04-2023 | #2719


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


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

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


Всем доброго дня.
Помогите, пожалуйста с такой проблемой. В одной из папок имеются одна папка с известным названием и несколько неизвестных папок ("Test kkkkkk", "Test ххх", "Test yyyyyyyy", "Test zzzz", ....). Во всех папок первое слово одинаковое. Нужно удалить неизвестные папки, у которых значения k, x, Y, z, ... непостоянные (неизвестные).
Как вариант подойдет что нибудь типа "удалить все папки, кроме одной с известным названием".

Отправлено: 19:30, 25-04-2023 | #2720



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




 
Переход