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

Компьютерный форум 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
Благодарности: 193

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


Цитата MKN:
почему не сработал OemToChar ? »
У плагина System параметр t означает ANSI (однобайтную) кодировку в ANSI-сборке и юникод в юникод-сборке.
Ввод-Вывод плагина ExecDos однобайтный (в основном), поэтому нужно использовать параметр m на входе OemToChar или выходе CharToOem:
Код: Выделить весь код
System::Call 'user32::OemToChar(mr0, t.r0)'
Этот вариант будет работать и в Unicode и в ANSI сборках.

Проверка на многострочном тексте показала, что этот способ портит символы \r, \n и, наверняка, другие спецсимволы.

Более корректный универсальный ansi/unicode способ в виде макроса:
Код: Выделить весь код
!define OemToChar `!insertmacro OemToChar`
!macro OemToChar STR
!ifdef NSIS_UNICODE
    Push $0
    System::Call 'kernel32::MultiByteToWideChar(i 1, i 0, m "${STR}", i -1, i 0, i 0) i.s'
    System::Call 'kernel32::MultiByteToWideChar(i 1, i 0, m "${STR}", i -1, t.r0, i s)'
    Exch $0
!else
    System::Call 'user32::OemToChar(m"${STR}", t.s)'
!endif
    Pop ${STR}
!macroend
Пример использования:
Код: Выделить весь код
    SetOutPath "$DOCUMENTS"
    nsExec::ExecToStack  `"$SYSDIR\cmd.exe" /c "" dir /b `
    Pop $0
    Pop $0
    StrCpy $0 $0 -2
    ${OemToChar} $0
    MessageBox MB_OK "$0"

Последний раз редактировалось iglezz, 27-02-2023 в 14:20.

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

Отправлено: 02:53, 27-02-2023 | #2661



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

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

MKN MKN вне форума

Ветеран


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

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


iglezz, благодарю за разъяснение и пример.

Обнаружил интересный многофункциональный плагин - NSutils
https://github.com/negrutiu/nsis-nsutils

В частности интересны его StartReceivingClicks и StopReceiveClicks - функции обратного вызова NSIS для пользовательских кнопок. Помнится в ряде случаев были сложности именно с "калбаками" для собственных кнопок в разных местах окон инсталлятора...
Хорошо бы на базе этого плагина(если он умеет) примеры увидеть...

Последний раз редактировалось MKN, 27-02-2023 в 15:46.


Отправлено: 15:33, 27-02-2023 | #2662


Старожил


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

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


MKN,
Кнопки для этого плагина нужно добавлять так-же как и для плагина ButtonEvent, через редактор ресурсов.
Проблем с колбеками не должно было быть и раньше - нужно всего лишь один раз понять их логику. В WinAPI вобще везде так - надо понять как это всё работает, иначе постоянно будут какие-то непонятки.

Вот примерчик для кнопки с NSutils:
Скрытый текст
Код: Выделить весь код
RequestExecutionLevel user
!include "LogicLib.nsh"
!include "nsDialogs.nsh"

Page components "" OnComponentsShow OnComponentsLeave

Function .onInit

FunctionEnd

Section 
SectionEnd

Var hComponentsButton

Function OnComponentsShow
    System::Call 'user32::GetClientRect(i $HWNDPARENT,@r1)i.r2'
    System::Call '*$1(i,i,i.r1,i.r2)'
    IntOp $2 $2 - 80

    System::Call 'user32::CreateWindowEx(i0,t"Button",\
        t"ClickMe!",\
        i${BS_PUSHBUTTON}|${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},\
        i0,ir2,ir1,i80,\
        i$HWNDPARENT,i0,ir0,i0)i.s'
    Pop $hComponentsButton
    CreateFont $0 '$(^Font)' '$(^FontSize)'
    SendMessage $hComponentsButton ${WM_SETFONT} $0 0

    System::Call 'user32::SetWindowPos(i $hComponentsButton,i0, i0,i0,i0,i0, i3)'

    GetFunctionAddress $0 OnComponentsButtonClicked
    NSutils::StartReceivingClicks $HWNDPARENT $0
FunctionEnd

Function OnComponentsButtonClicked
    Pop $1
    Pop $2
    ${If} $1 = $hComponentsButton
        MessageBox MB_OK "Clicked$\nHWND $1$\nID $2"
    ${EndIf}

FunctionEnd

Function OnComponentsLeave
	NSutils::StopReceivingClicks $HWNDPARENT
FunctionEnd

Кнопка создаётся в рантайме, посему криво (про это я объяснял с соседней теме по AutoIt)
Лучше кнопки добавлять в редакторе ресурсов. Их можно сделать изначально невидимыми (без атрибута WS_VISIBLE) и делать видимыми (и даже перемещать/менять размер) по мере необходимости.
Если хочется без проблем добавлять всякие штуки налету то придётся предварительно подправить диалоги (их порядок и свойства).
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:15, 27-02-2023 | #2663


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


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

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


Приветствую всех.
Тут такое дело. Имеется батник, который имеет две функции:
1. Создает текстовый файл расширения .ics с добавлением в него нужных строк.
2. Если этот файл со своими строками уже имеется, то батник добавляет в готовый файл только нужные строки не трогая имеющихся и не дублирует те, которые нужно добавить, если таковы имеются
Вот его код:

Скрытый текст
Код: Выделить весь код
@echo off
set "File=hosts.ics"
set "Folder=%windir%\system32\drivers\etc"
pushd "%Folder%"||(pause &exit /B 2)
set "@Add001=0.0.0.0 martau.com"
set "@Add002=0.0.0.0 www.martau.com"
set "@Add003=0.0.0.0 total-uninstall.com"
set "@Add004=0.0.0.0 www.total-uninstall.com"
set "@Add005=0.0.0.0 64.91.254.118"
attrib -R -S -H "%File%"
set /A NOld=1000
for /F "usebackq delims=" %%s in ("%File%") do (set /A NOld+=1 &call set "@Old%%NOld%%=%%s")
for /F "usebackq tokens=1* delims==" %%i in (`2^>nul set "@Add"`) do (set /A NOld+=1 &Call set "@Old%%NOld%%=%%j")
for /F "usebackq tokens=1* delims==" %%i in (`2^>nul set "@Old"`) do (set "SS=%%j" &Call set "@%%i=%%SS: =%%")
>"%File%" (for /L %%i in (1001,1,%NOld%) do call :AnalizHosts %%i)
attrib +R "%File%"
popd
exit
:AnalizHosts
call set "A=%%@@Old%1%%"
if /I "%A%"=="" exit /B 1
if "%A:~0,1%"=="#" (call echo %%@Old%1%%&exit /B 0)
(call echo %%@Old%1%%)
for /F "usebackq tokens=1* delims==" %%i in (`2^>nul set "@@Old"`) do if /I "%%j"=="%A%" call set "%%i="
exit /B 0

Сделал точную работу этого батника в NSIS, работает отлично, но код какой-то громоздкой получился.
Можно ли этот код каким нибудь образом упростить или усовершенствовать или он таким и должен быть?

Скрытый текст
Код: Выделить весь код
Function DelLine
        StrCpy $0 SkipWrite
        Push $0
FunctionEnd

Section

Var /global Text
Var /global Text1
Var /global Text2
Var /global Text3
Var /global Text4

StrCpy $Text "0.0.0.0 martau.com"
StrCpy $Text1 "0.0.0.0 www.martau.com"
StrCpy $Text2 "0.0.0.0 total-uninstall.com"
StrCpy $Text3 "0.0.0.0 www.total-uninstall.com"
StrCpy $Text4 "0.0.0.0 64.91.254.118"

    ${If} ${FileExists} "$SYSDIR\drivers\etc\hosts.ics"

    SetFileAttributes "$SYSDIR\drivers\etc\hosts.ics" NORMAL

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read: 
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end 
 readnow:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text" "E+1{" $R2
   IfErrors read 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow
end:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read1: 
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end1
 readnow1: 
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text1" "E+1{" $R2
   IfErrors read1 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine" 
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow1
end1:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read2: 
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end2
 readnow2:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text2" "E+1{" $R2 
   IfErrors read2 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow2
end2:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read3: 
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end3
 readnow3:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text3" "E+1{" $R2
   IfErrors read3 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0 
 goto readnow3
end3:

${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
StrCpy $R1 0
read4: 
 IntOp $R1 $R1 + 1
 IntCmp $R1 $R0 0 0 end4
 readnow4:
 ${LineRead} "$SYSDIR\drivers\etc\hosts.ics" "$R1" $R3
 ${WordFind} "$R3" "$Text4" "E+1{" $R2
   IfErrors read4 0
 ${LineFind} "$SYSDIR\drivers\etc\hosts.ics" "" "$R1" "DelLine"
 ${LineSum} "$SYSDIR\drivers\etc\hosts.ics" $R0
 goto readnow4
end4:

    ${EndIf}

    FileOpen $0 "$SYSDIR\drivers\etc\hosts.log" w
    FileWrite $0 "0.0.0.0 martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 64.91.254.118 $\r$\n"
    FileClose $0

    ${If} ${FileExists} "$SYSDIR\drivers\etc\hosts.ics"
    ${FileJoin} "$SYSDIR\drivers\etc\hosts.log" "$SYSDIR\drivers\etc\hosts.ics" "$SYSDIR\drivers\etc\hosts.ics"
    Delete "$SYSDIR\drivers\etc\hosts.log"
    ${Else}
    Rename "$SYSDIR\drivers\etc\hosts.log" "$SYSDIR\drivers\etc\hosts.ics"
    ${EndIf}

    SetFileAttributes "$SYSDIR\drivers\etc\hosts.ics" READONLY

SectionEnd

Отправлено: 14:43, 02-03-2023 | #2664

MKN MKN вне форума

Ветеран


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

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


Цитата inco1:
упростить или усовершенствовать »
Поместить работу с строками и пр. - в цикл.

Отправлено: 09:47, 04-03-2023 | #2665


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


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

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


Цитата MKN:
Поместить работу с строками и пр. - в цикл. »
Можно пример этого цикла?

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


Старожил


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

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


inco1, Код нужно усовершенствовать, ибо он дико неоптимален (сам язык в основе скуден, а комплектные библиотеки (nsh) по этой части страшны). Громоздкость хорошо заметается под макросы и прячется в отдельные библиотечки.

Батник корректно работающим можно назвать только в двух случаях:
1. добавляемых строк в файле нет;
2. строки уже были добавлены в формате, жёстко заданном батником (скорее всего самим же батником ранее).

В остальных случаях он будет плодить мусор в виде дублирующихся неработающих записей.

Основных проблем тут две.

Первая - простая техническая.
Добыть данные из файла. Обработать. Запихнуть обратно. В процессе ничего не сломать.
И чтобы код можно было понимать и поддерживать спустя полгода.

Правильная работа начинается с правильной обработки строк, а каждая строка-запись в максимуме может содержать IP-адрес, энное количество хостов и комментарий с пробелами или табуляциями в качестве разделителей. Обычные прелести минимально структурированного простого текста. Разбор всего этого в NSIS растянется на сотни строк, это не питон какой-нибудь, где строку можно распарсить одной регуляркой.
Строки могут записаны
так
Код: Выделить весь код
0.0.0.0 martau.com #site1
      0.0.0.0  www.martau.com  #site2
0.0.0.0            total-uninstall.com
или так
Код: Выделить весь код
0.0.0.0 martau.com  www.martau.com total-uninstall.com
или даже так
Код: Выделить весь код
                0.0.0.0   martau.com www.martau.com www.total-uninstall.com # block total-uninstall.com


По хорошему надо вытаскивать все данные в некую структуру (список/массив), анализировать и потом записывать обратно.
И помнить про обработку ошибок - мало дать команду на запись, надо ещё убедится, что изменения реально записаны.

Вторая проблема - посложнее.
КАК реализовать техническую часть, чтобы всё работало, чтобы ничего не сломать пользователю, чтобы была возможность отката своих изменений.

Рабочий пример с в меру гибкой обработкой hosts file есть по ссылке. То, что под капотом (hostsblock.nsh), местами корявое, местами страшное, но рабочее с большего. Со стороны основного скрипта одна команда с всего двымя параметрами - имя файла и хост.
В примере присутствует !define DEBUG - это нужно только для отладки, если что-то вдруг пойдёт не так.
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:51, 05-03-2023 | #2667


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


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

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


iglezz, это наилучшее решение, имеющееся сегодня в NSIS для HOSTS.
Проверил практически на всех системах, и с UAC и без, и с пробелами в строках и без. Работает без сучка и задоринки. Мне прекрасно подходит.
Чтобы работало для моего файла "hosts.ics" я поменял в hostsblock.nsh все 54 "hosts" на "hosts.ics" и переименовал на "hostsicsblock.nsh".
Результат простейшего экзешника без Errors получился таким:

Скрытый текст
Код: Выделить весь код
Unicode true
SetOverwrite on
RequestExecutionLevel admin
!include "x64.nsh"
!include "LogicLib.nsh"
!include "hostsicsblock.nsh"
Section
Var /global hostsics
    StrCpy $hostsics "$SYSDIR\drivers\etc"
${IfThen} ${RunningX64} ${|} ${DisableX64FSRedirection} ${|}
${If} ${FileExists} "$hostsics\hosts.ics"
    SetFileAttributes "$hostsics\hosts.ics" NORMAL
    StrCpy $0 '$hostsics\hosts.ics'
    StrCpy $1 '$hostsics\1.txt'
    StrCpy $2 '$hostsics\2.txt'
    CopyFiles /SILENT $0 $1
    FileOpen  $3 $1 A
    FileSeek  $3 0 END
    FileClose $3
    CopyFiles /SILENT $1 $2
    FileOpen $3 $2 A
    FileClose $3
    ${hosts.icsfile_BlockHost} $2 'martau.com'
    ${hosts.icsfile_BlockHost} $2 'www.martau.com'
    ${hosts.icsfile_BlockHost} $2 'www.total-uninstall.com'
    ${hosts.icsfile_BlockHost} $2 'total-uninstall.com'
    ${hosts.icsfile_BlockHost} $2 '64.91.254.118'
    CopyFiles /SILENT $2 $0
    Delete "$hostsics\1.txt"
    Delete "$hostsics\2.txt"
${Else}
    FileOpen $0 "$hostsics\hosts.ics" w
    FileWrite $0 "0.0.0.0 martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.martau.com $\r$\n"
    FileWrite $0 "0.0.0.0 total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 www.total-uninstall.com $\r$\n"
    FileWrite $0 "0.0.0.0 64.91.254.118 $\r$\n"
    FileClose $0
${EndIf}
    SetFileAttributes "$hostsics\hosts.ics" READONLY
SectionEnd

Я так думаю, что для моей задачи с файлом "hosts.ics" код можно использовать и без вставки обработки ошибок.
Огромнейшая благодарность за проделанную работу над hostsblock.nsh.

Отправлено: 16:45, 05-03-2023 | #2668

MKN MKN вне форума

Ветеран


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

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


Цитата iglezz:
Рабочий пример »
Вот это помогли товарищу уменьшить код... Но всё равно здорово. Спасибо.
Цитата iglezz:
местами корявое, местами страшное »
Вот и я сваял нечто, но рабочее и наглядное в понимании... В хосте есть смысл искать всего два слова в строке, т.к. в одну строку редко пишут...
Цитата:
outfile host-test.exe
;unicode true

!include "LogicLib.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"
!include "StrFunc.nsh"

Var Str
Var Word_a1
Var Word_a2
Var Word_a3
Var Word_a4
Var Word_a5
Var Word_b2
Var Word_c2
Var Word_d2
Var Word_e2
Var Word_f2

!define a "0.0.0.0"
!define b2 "martau.com"
!define c2 "www.martau.com"
!define d2 "total-uninstall.com"
!define e2 "www.total-uninstall.com"
!define f2 "64.91.254.118"

Section
FileOpen $R4 "$EXEDIR\hosts.ics" r
FileOpen $R5 "$EXEDIR\hosts2.ics" w
IfErrors done
ClearErrors
${LineSum} "$EXEDIR\hosts.ics" $8
StrCpy $3 0
${Do}
IntOp $3 $3 + 1
${LineRead} "$EXEDIR\hosts.ics" "$3" $Str

${If} $3 = 1
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a1 ; outvarerror =1 ,если слово для замены не найдено
${WordReplace} '$Str' "${b2}" "${b2}" "E+" $Word_b2
${ElseIf} $3 = 2
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a2
${WordReplace} '$Str' "${c2}" "${c2}" "E+" $Word_c2
${ElseIf} $3 = 3
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a3
${WordReplace} '$Str' "${d2}" "${d2}" "E+" $Word_d2
${ElseIf} $3 = 4
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a4
${WordReplace} '$Str' "${e2}" "${e2}" "E+" $Word_e2
${ElseIf} $3 = 5
${WordReplace} '$Str' "${a}" "${a}" "E+" $Word_a5
${WordReplace} '$Str' "${f2}" "${f2}" "E+" $Word_f2
${EndIf}

${If} $5 = 1
Goto next1
${ElseIf} $5 = 2
Goto next2
${ElseIf} $5 = 3
Goto next3
${ElseIf} $5 = 4
Goto next4
${ElseIf} $5 = 5
Goto next5
${EndIf}

${If} $Word_a1 = 1
${OrIf} $Word_b2 = 1
FileWrite $R5 "${a} ${b2}$\r$\n"
StrCpy $5 1
${EndIf}
next1:
${If} $Word_a2 = 1
${OrIf} $Word_c2 = 1
FileWrite $R5 "${a} ${c2}$\r$\n"
StrCpy $5 2
${EndIf}
next2:
${If} $Word_a3 = 1
${OrIf} $Word_d2 = 1
FileWrite $R5 "${a} ${d2}$\r$\n"
StrCpy $5 3
${EndIf}
next3:
${If} $Word_a4 = 1
${OrIf} $Word_e2 = 1
FileWrite $R5 "${a} ${e2}$\r$\n"
StrCpy $5 4
${EndIf}
next4:
${If} $Word_a5 = 1
${OrIf} $Word_f2 = 1
FileWrite $R5 "${a} ${f2}$\r$\n"
StrCpy $5 5
${EndIf}
next5:
${If} $3 > $8
${ExitDo}
${EndIf}
${Loop}
done:
FileClose $R4
FileClose $R5
SectionEnd
Замена части однотипных действий макросами уменьшит код на треть... Пути хоста ессно выбраны для наглядности примера. Окончательные и очевидные действия в код не включены.

Последний раз редактировалось MKN, 05-03-2023 в 17:47.

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

Отправлено: 17:41, 05-03-2023 | #2669


Старожил


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

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


inco1,
1. Менять в hostsblock.nsh ничего не надо. Кроме случаев изменения функционала / правки ошибок.
2. В секции примера много лишнего. Её содержімое можно записать компактнее
Скрытый текст
Код: Выделить весь код
Section
    ${IfThen} ${RunningX64} ${|} ${DisableX64FSRedirection} ${|}
    
    Var /global hostsfile
    StrCpy $hostsfile "$SYSDIR\drivers\etc\hosts.ics"

    ${IfNot} ${FileExists} $hostsfile
        FileOpen  $0 $hostsfile W
        FileClose $0
    ${EndIf}

    SetFileAttributes $hostsfile NORMAL

    ${hostsfile_BlockHost} $hostsfile 'martau.com'
    ${hostsfile_BlockHost} $hostsfile 'www.martau.com'
    ${hostsfile_BlockHost} $hostsfile 'www.total-uninstall.com'
    ${hostsfile_BlockHost} $hostsfile 'total-uninstall.com'
    ${hostsfile_BlockHost} $hostsfile '64.91.254.118'

    SetFileAttributes $hostsfile READONLY
SectionEnd


MKN,
Цитата MKN:
Вот это помогли товарищу уменьшить код... »
А он так и уменьшается - вся сложность загоняется под коврик и наружу торчит простой интерфейс. На голом ассемблере нынче писать не особо стремятся

Последний раз редактировалось iglezz, 05-03-2023 в 17:53.

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

Отправлено: 17:43, 05-03-2023 | #2670



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




 
Переход