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

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

 

Аватара для Dodakaedr

Ветеран


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

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


Цитата K.A.V.:
Вам вызвать 2 раза функцию с разным текстом искомой строки религия не позволяет? »
позволяет конечно, пробовал, но не получается.
Цитата K.A.V.:
Не понимаю, чего вы от меня ещё хотите »
как я уже и раньше говорил - примерчик.
Собрал такое, но не работает
Код: Выделить весь код
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${LineRead} "$DESKTOP\hosts" "$R4" $R5 ; читаем содержимое строки
 ${WordFind} "$R3" "127.0.0.1 winxpregp.narod.ru" "E+1{" $R2 ; ищем фразу в строке
 ${WordFind} "$R5" "127.0.0.1 winxp.narod.ru" "E+1{" $R6 ; ищем фразу в строке
 IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineFind} "$DESKTOP\hosts" "" "$R4" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0 ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow
end:

-------
Inno Setup 5 Ultra Unicode


Отправлено: 23:14, 15-05-2015 | #1631



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

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


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

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


Contributor


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

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


Цитата Dodakaedr:
как я уже и раньше говорил - примерчик. »
Я вам его предоставил, но вопрос тут в том, что вы не можете им воспользоваться по одной простой причине - вы не знаете базовой информации о NSIS и как вообще пишутся скрипты, поэтому рекомендую начать штудировать наш справочник, особенно страничку о переменных, которая бы помогла решить вашу проблему с моим примером.

Цитата Dodakaedr:
Собрал такое, но не работает »
А с чего бы "такому" работать?

Код: Выделить весь код
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${LineRead} "$DESKTOP\hosts" "$R4" $R5 ; читаем содержимое строки
 ${WordFind} "$R3" "127.0.0.1 winxpregp.narod.ru" "E+1{" $R2 ; ищем фразу в строке
 ${WordFind} "$R5" "127.0.0.1 winxp.narod.ru" "E+1{" $R6  ; ищем фразу в строке
 IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineFind} "$DESKTOP\hosts" "" "$R4" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0 ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow
Первая выделенная строка.
Ошибка чтения строки, почему? Потому что вы передаёте ранее не задействованную переменную $R4 с пустым значением, соответственно, никакая строка прочитана не будет

Вторая выделенная строка.
Т.к. выше была ошибка чтения строки, то и поиск фразы будет неудачным

Третья выделенная строка.
Т.к. было выше 2 ошибки, никакая строка удалена не будет

Вы просто наугад подставили переменные и думали, что код магическим образом заработает?

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

Код: Выделить весь код
Function test 
Var /global MyText
StrCpy $MyText "winxpregp.narod.ru"
 call DeleteLineFunc
 
StrCpy $MyText "microsoft.com"
 call DeleteLineFunc
 
StrCpy $MyText "oszone.net"
 call DeleteLineFunc  
FunctionEnd


Function DeleteLineFunc
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext: 
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end 
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${WordFind} "$R3" "$MyText" "E+1{" $R2 ; ищем фразу в строке
   IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и  читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0  ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow 
end:
FunctionEnd

Function DeleteLineCallback
	StrCpy $0 SkipWrite
	Push $0
FunctionEnd


Читайте Справочник по NSIS, моя любимая фраза для новичков, которую я не люблю повторять

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

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

Отправлено: 00:19, 16-05-2015 | #1632

MKN MKN вне форума

Ветеран


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

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


Цитата Dodakaedr:
И как удалять значение из файла hosts? »
Первым делом надо получить права на работу с реальным файлом hosts ( $SYSDIR\drivers\etc\hosts )
Без этого, как правило, манипуляции с файлом будут не возможны... (т.к. либо файл "занят" системой , а ещё хуже, когда файл hosts под контролем какого нибудь "защитника" или антивируса, что встречается всё чаще и чаще... )

Отправлено: 10:01, 16-05-2015 | #1633


Аватара для Dodakaedr

Ветеран


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

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


Цитата MKN:
Первым делом надо получить права на работу с реальным файлом hosts »
И как это сделать?

-------
Inno Setup 5 Ultra Unicode


Отправлено: 16:06, 16-05-2015 | #1634


Аватара для Dodakaedr

Ветеран


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

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


Решил в одну функцию запихнуть удаление строк в файле hosts с проверкой атрибута для удобства, при выходе из исталлятора атрибут снимается, но не ставится обратно после удаления строк. Вызываю вот такую функцию
Код: Выделить весь код
function delete
${GetFileAttributes} "$DESKTOP\hosts" "READONLY" $R0
StrCmp $R0 "1" 0 +2
SetFileAttributes "$DESKTOP\hosts" "NORMAL"
StrCpy $MyText "127.0.0.1 support.soft.com"
 call DeleteLineFunc
StrCpy $MyText "127.0.0.1 soft.com"
 call DeleteLineFunc
StrCmp $R0 "1" 0 +2 ;если здесь поставить +1 то атрибут ставится постоянно не зависимо от результата проверки
SetFileAttributes "$DESKTOP\hosts" "READONLY"
functionend
Почему не ставится обратно атрибут?
И еще вопрос: при удалении строк в конце файла постоянно остается пустая строка и получается что после 10 запусков в итоге имеем 10 пустых строк. Как сделать чтобы не оставалась пустая строка?

-------
Inno Setup 5 Ultra Unicode


Последний раз редактировалось Dodakaedr, 16-05-2015 в 20:21.


Отправлено: 20:11, 16-05-2015 | #1635


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

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


Contributor


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

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


Цитата Dodakaedr:
Почему не ставится обратно атрибут? »
Давайте порассуждаем на эту тему, как вы думаете, почему атрибут не ставится? Ведь в изначальном варианте он был рабочим, так? Посмотрите на ваш код внимательней и попробуйте сами ответить на свой вопрос

Цитата Dodakaedr:
StrCmp $R0 "1" 0 +2 ;если здесь поставить +1 то атрибут ставится постоянно не зависимо от результата проверки »
Повторю в последний раз, читайте Справочник по NSIS, ленивых и не желающих вникать в NSIS "кодеров" не переношу

крик души

блин, вот скажите мне, для кого писался справочник?
Я создавал его в надежде на то, что им будут пользоваться менее опытные кодеры, которым я смогу передать полученные знания и хотел, чтобы другие люди чему-то научились из этого справочника, но почему-то всё же находятся такие личности, которые хотят "всё и сразу и без чтения инфы" - ребят, в этой теме так не бывает, хотите, чтобы вам помогали решить вашу проблему - будьте добры, прочитайте справочник (да хотя бы самый минимум, те команды, которые используете - пишите правильно, а не наугад подставляйте параметры)
Ключевое слово - помогаем, а не делаем всё за вас
такое ощущение складывается, как-будто мне это нужно и я сижу уговариваю человека "ну прочитай, пожалуйста"


Цитата Dodakaedr:
И еще вопрос: при удалении строк в конце файла постоянно остается пустая строка и получается что после 10 запусков в итоге имеем 10 пустых строк. Как сделать чтобы не оставалась пустая строка? »
Вопрос или задание для нас?
Давайте вы:
1. Воспользуетесь поиском по этой и предыдущей теме NSIS по ключевым словам LineFind, LineRead
2. Прочитаете в справке описание команд LineRead, StrCmp
3. Попробуете совместить команды LineRead, StrCmp с моим кодом удаления строки, в котором каждая строка с комментарием
4. Покажите, что у вас получилось

Давайте запустим здесь для всех ленивых новичков режим "Обучение", будем только указывать на ошибки, давать рекомендации и не будем давать готовых кодов?
Посмотрим, через какое время им всё же придётся обратиться к справочнику
Мне кажется, этот способ будет очень эффективный, не хотите изучать NSIS - либо мы заставим, либо вы забьёте на NSIS

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

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

Отправлено: 21:03, 16-05-2015 | #1636


Аватара для Dodakaedr

Ветеран


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

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


Цитата K.A.V.:
как вы думаете, почему атрибут не ставится? »
наверное из-за переменной $R0, она берется уже с call DeleteLineFunc? Применил свою переменную, все заработало.
Цитата K.A.V.:
блин, вот скажите мне, для кого писался справочник? »
для реальных новичков! а не для
Цитата K.A.V.:
менее опытные кодеры »
у меня опыта с nsis ноль целых х*р десятых. Да и в программировании где-то также.
Цитата K.A.V.:
будьте добры, прочитайте справочник (да хотя бы самый минимум, те команды, которые используете - пишите правильно, а не наугад подставляйте параметры) »
читаю я ваш справочник, если бы все понимал то и не спрашивал помощи, а так команды строковые для меня вообще темный лес. По поводу "наугад" это вы подумали про переход +1 в комментарии в строке
Код: Выделить весь код
StrCmp $R0 "1" 0 +2 ;если здесь поставить +1 то атрибут ставится постоянно не зависимо от результата проверки
так это я для сравнения написал, хотя наверное это и ни к чему было. Про метки и переходы все ясно. Не могу понять принцип работы строковых команд а именно как и что сравнивать надо. Нашел пример
Скрытый текст
Код: Выделить весь код
Function ReplaceLinesInFile

${LineSum} "$_FindInFile" $_LineNumbers ; Подсчитываем количество строк
strcpy $_CurLineNumber 0
startLineRead:
intop $_CurLineNumber $_CurLineNumber + 1
IntCmp $_CurLineNumber $_LineNumbers 0 0 endFunc ; Если номер текущей строки больше количества строк в файле - поиск завершен
${LineRead} "$_FindInFile" "$_CurLineNumber" $_CurLine ; Читаем строку по номеру текущей строки
${WordFind} '$_CurLine' "$_LineReplace" "E+1{" $R0 ; Ищем в строке нужный текст
StrCmp $R0 "1" startLineRead 0 ; Если в строке присутствует искомый текст, выполняем код ниже
${LineFind} "$_FindInFile" "" "" "Insert_Line" ; Вызываем функцию Insert_Line, которая произведёт замену
goto startLineRead
endFunc:
;
FunctionEnd
Function Insert_Line
StrCmp $R8 "$_CurLineNumber" 0 push
        ${StrRep} $_CurLine "$_CurLine" "$_LineReplace" "$_LineToInsert"
	FileWrite $R4 "$_CurLine"
	StrCpy $0 SkipWrite
	push:
	Push $0
FunctionEnd
который похож с моей проблемой, но совместить с вашим кодом не могу.
Цитата K.A.V.:
Мне кажется, этот способ будет очень эффективный, не хотите изучать NSIS - либо мы заставим, либо вы забьёте на NSIS »
главное чтобы у вас терпения хватило

-------
Inno Setup 5 Ultra Unicode


Отправлено: 23:13, 16-05-2015 | #1637


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

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


Contributor


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

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


Цитата Dodakaedr:
наверное из-за переменной $R0, она берется уже с call DeleteLineFunc? Применил свою переменную, все заработало. »
Ну вот видите, достаточно всего-лишь внимательно смотреть на код и на используемые переменные. Значение переменной может быть изменено в любой части кода, что может повлиять на функционал других функций, использующих одну переменную.
Ещё советую при использовании команд внимательно читать описание к команде, некоторые команды в NSIS переназначают значения переменных своими данными, из-за чего ваш код так же может оказаться некорректным, если вы используете те же переменные, что и команда NSIS, простой пример - команда Locate для поиска файлов, её callback функция использует переменные для хранения своих данных во время процесса поиска:
Код: Выделить весь код
Function "Function"
    ; $R9    "путь\имя"
    ; $R8    "путь"
    ; $R7    "имя"
    ; $R6    "размер"  ($R6="" если директория, $R6="0" если поиск с ключем /S=)

    ; $R0-$R5  не используется функцией.
    ; ...

    Push $var    ; Если $var="StopLocate" Завершение функции
FunctionEnd
Цитата Dodakaedr:
у меня опыта с nsis ноль целых х*р десятых. Да и в программировании где-то также. »
Скрытый текст
Для изучения конкретно NSIS вам нужно только одно - желание. Я тут уже 100 раз рассказывал, как лично я познакомился с NSIS будучи ещё совсем "зелёным" (во всех смыслах), я не то чтобы даже английский язык не знал, я в то время даже не знал, что такое интернет и редактор реестра. У меня кроме дистрибутива с непонятной программой (NSIS), которая просто была на CD в куче софта, больше ничего не было, ни знаний компьютерных, ни интернета, ни уж тем более справочника на русском
Я даже сейчас не знаю ни одного языка программирования и английского языка тоже не знаю, но просто есть желание и упорство - всё получается, это я к тому, что всё зависит только от вас, к тому же, у вас есть то, чего не было лично у меня - помощь со стороны более опытных кодеров и русская справка, пусть и не с огромным количеством всяких примеров и переведённых команд - но всё же для получения базовых знаний о NSIS справочник вполне сойдёт.

Цитата Dodakaedr:
читаю я ваш справочник, если бы все понимал то и не спрашивал помощи, а так команды строковые для меня вообще темный лес »
Если после прочтения описания команды в справочнике и проведения тестов вы всё-равно не понимаете, как пользоваться командой - приходите и спрашивайте, что конкретно не понятно, в чем проблема то.
-------
Цитата Dodakaedr:
Не могу понять принцип работы строковых команд а именно как и что сравнивать надо »
Так вы логику действий у себя в голове выстроите и продумывайте команды, разберём простой пример: вам нужно удалить пустую строку
Вот дальше вам необходимо понять всю силу фразы "Читайте справочник", если вы будете знать о всех командах, которые вам доступны в NSIS - вы будете писать код в несколько раз быстрее, зная команды - у вас в голове сразу будет строится код.
Что для этого нужно? Так, ну, раз у меня простой текстовый файл, значит для начала мне нужно прочитать строку, а как я могу прочитать строку? Точно, есть же команда LineRead!
Код: Выделить весь код
${LineRead} "[Файл]" "[Номер строки]" $var
Так, ну, допустим, я прочитаю первую строку, а если моя строка записана второй, как мне сделать универсальный код, не дублируя строки? Точно, есть же математическая команда IntOp, я сделаю счетчик и он будет плюсоваться после чтения строки, если это не моя строка - будем увеличивать счетчик и идти дальше по файлу!

В голове строится код
Код: Выделить весь код
StrCpy $1 0 ; нам сначала нужно обнулить счетчик, т.к. переменная возможно уже ранее использовалась
IntOp $1 $1 + 1 ; в переменную будет помещено текущее значение переменной $1 с прибавлением на 1
${LineRead} "[Файл]" "$1" $0
Так, круто, что дальше то, я прочитал первую строку, а как понять, что она пустая то? Точно, есть же команда StrCmp!
Т.к. содержимое прочитанной строки помещается в переменную $0 (смотри описание команды LineRead), то, соответственно, нам нужно сделать условие сравнения этой переменной с пустым значением в команде StrCmp, с пустым потому, что нам нужно определить, что прочитанная строка действительно пустая, а не с данными
Код: Выделить весь код
StrCpy $1 0 ; нам сначала нужно обнулить счетчик, т.к. переменная возможно уже ранее использовалась
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 ЕСЛИ_НЕТ ; метка 0 означает, что если условие истина, т.е. значение переменной $0 - пусто, то опускаемся дальше по коду
так, а что мне делать дальше то? Если строка пустая, то...она мне не нужна, значит прописываю команду удаления ниже по коду, а как? Точно, мне же K.A.V. пример кидал с комментарием на каждой строке!
Код: Выделить весь код
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
так, в комменте сказано, что в команду нужно передавать номер строки, а у меня он где?! Точняк, это же счетчик в переменной $1, значит меняю переменную из примера на свою
Код: Выделить весь код
StrCpy $1 0
IntOp $1 $1 + 1
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 ЕСЛИ_НЕТ
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
так, что дальше то делать после удаления строки? а, ну, нам нужно прочитать следующую строку, т.е. нам нужно как-то вернуться на начало код...хм, о, есть же команда goto, её нужно поместить так, чтобы после удаления строки наш счетчик увеличился
Код: Выделить весь код
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 ЕСЛИ_НЕТ
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NextLineRead
Вроде что-то получается, так, K.A.V. же вроде говорил, что при удалении строки - другие строки смещаются, значит если у меня будет 2 пустые строки подряд, то я сначала удалю первую, у меня увеличится счетчик и я пропущу вторую строку, которая сместилась выше относительно других строк...как же быть, о, значит после удаления строки нам нужно прочитать эту строку ещё раз! Давай добавим меточку и изменим условие после удаления строки
Так, стоп, а как же условие того, что наша строка не пустая, что делать то...а, ну всё правильно, нам нужно перейти к следующей строке, значит в условие StrCmp делаем ссылку на метку NextLineRead
Код: Выделить весь код
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
NowRead:
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NowRead
Во, вроде всё правильно! хотя...блин, а как я пойму, что строки в файле то закончились? У меня же получился бесконечный цикл чтения файла
Точно, есть же команда LineSum, которая подсчитывает общее количество строк в файле! Давай-ка её в начало пропишем и назначим переменную для хранения $R0.
Код: Выделить весь код
${LineSum} "[Файл]" $R0 
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
NowRead:
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NowRead
Тааак, теперь я знаю количество строк в файле! Теперь нужно вставить условие после счетчика и сравнивать, достигнута ли последняя строка, но подожди, комадна StrCmp же не подойдёт, потому что если я увеличу счетчик и сразу же сравню это значение с общим количеством строк - я могу не прочитать последнюю строку, значит нужна другая команда...точно, IntCmp!
Я укажу так, что если текущий счетчик строки больше общего количества строк, то закончим обработку, а если меньше либо равно - то продолжу чтение
Код: Выделить весь код
${LineSum} "[Файл]" $R0 
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
IntCmp $1 $R0 0 0 end
NowRead:
${LineRead} "[Файл]" "$1" $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  goto NowRead
end:
Так, ну, вроде бы всё...а нет, K.A.V. же ещё делал замечание по поводу того, что если мы удаляем строку - то общее количество строк становится меньше, и чтобы не делать лишних попыток чтения после удаления нескольких строк, нам нужно после каждой команды удаления строки заново получать общее количество строк в файле, продублирую команду
Код: Выделить весь код
${LineSum} "[Файл]" $R0 
StrCpy $1 0
NextLineRead:
IntOp $1 $1 + 1
IntCmp $1 $R0 0 0 end
NowRead:
${LineRead} "[Файл]" "$1" $0
${TrimNewLines} '$0' $0
  StrCmp $0 "" 0 NextLineRead
  ${LineFind} "$DESKTOP\hosts" "" "$1" "DeleteLineCallback"
  ${LineSum} "[Файл]" $R0 
  goto NowRead
end:
Кстати, при использовании LineRead в переменной будет значение с символом перехода на новую строку, поэтому команда сравнения может не сработать, для удаления символа перехода на новую строку мы используем команду ${TrimNewLines} после чтения строки
Вроде бы всё, осталось добавить callback функцию DeleteLineCallback для удаления строки
Код: Выделить весь код
Function DeleteLineCallback
	StrCpy $0 SkipWrite
	Push $0
FunctionEnd
Круто, работает! Вроде и ничего сложного, если знаешь, какие команды есть в NSIS...

На самом деле, если посмотреть на этот код - здесь реально ничего мегакрутого нет - обычный код с использованием стандартных команд, вся фишка в том, что я знаю много команд в NSIS и знаю, что конкретно могу получить от той или иной команды. На основе этих знаний у меня код в голове строится автоматически, остаётся только его напечатать и проверить работоспособность
В примере этого сообщения я вам продемонстрировал, как на самом деле всё просто, достаточно всего-лишь знания команд NSIS и немного времени, чтобы продумать логику действий в коде.

Цитата Dodakaedr:
главное чтобы у вас терпения хватило »
Главное, чтобы вы реально прочитали справочник перед написанием постов в этой теме, в этой теме было пару человек, сообщения которых я просто игнорировал, зная ответы, по причине того, что им лень было открыть справочник и прочитать инфу, когда их об этом просили неоднократно, им нужны были только готовые примеры.

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


Последний раз редактировалось K.A.V., 17-05-2015 в 02:20.

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

Отправлено: 02:09, 17-05-2015 | #1638


Аватара для Limonica

Старожил


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

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


Цитата MKN:
Определение у пользователя прав администратора :

Цитата:
OutFile "Admin_privileges.exe"
Section
System::Call "kernel32::GetModuleHandle(t 'shell32.dll') i .s"
System::Call "kernel32::GetProcAddress(i s, i 680) i .r0"
System::Call "::$0() i .r0"
IntCmp $0 1 +3
MessageBox MB_OK "Требуются права администратора для запуска этой установки"
Abort
SectionEnd
»
MKN можешь доработать способ чтобы определял какими привилегиями обладает аккаунт (как UserInfo) пользователя?

Отправлено: 00:31, 25-05-2015 | #1639


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

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


Contributor


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

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


Кстати, есть более простой способ определения админских прав, всего одна строчка кода
Код: Выделить весь код
      System::Call setupapi::IsUserAdmin()i.r0
      StrCmp $0 "1" 0 +2
      MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"     
      StrCmp $0 "0" 0 +2
      MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора"

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

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

Отправлено: 07:57, 25-05-2015 | #1640



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




 
Переход