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

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

 
MKN MKN вне форума

Ветеран


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

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


Цитата K.A.V.:
Я в NSIS новичок, поэтому всех тонкостей не знаю »
Если бы все были такими "новичками"... то давно бы Windows на NSIS переписали.

Отправлено: 10:16, 14-03-2015 | #1541



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

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


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


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

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



Привет народ,
Имеется вопрос.. Ковыряю один инсталлер, формально всё по тех. части оригинального уже воссоздал и прописал что нужно..
Но, не работает как надо только кусок мелкого оформления. Не отображаются тексты на странице Велком и её заголовка..

Пример в картинках:
Скрытый текст
Оригинал:
MDK-01.png MDK-02.png

Восстановленный:
MDK-03.png MDK-04.png

Пример кода..

Код: Выделить весь код
;===============================================================================
;Modification Development Kit Setup Script
;===============================================================================
; Conditional Compilation
;	!define MDK_SMALL ; exclude stuff
	!define MDK_COLOR ; modified NSIS
;	!define MOD_INCLUDE_PLAYERKIT


; Compiler Settings
CRCCheck force
SetCompressor lzma
!ifdef G2MDK_SMALL
SetCompressorDictSize 128 ; see RAM table
!else
SetCompressorDictSize 32 ; see RAM table
!endif
; DictSize Compress Decompress
;     8 MB   141 MB   10 MB (default)
;    12 MB   179 MB   14 MB
;    16 MB   217 MB   18 MB
;    24 MB   293 MB   26 MB
;    32 MB   369 MB   35 MB
;    48 MB   521 MB   50 MB
;    64 MB   673 MB   66 MB
;    96 MB   977 MB   98 MB
;   128 MB  1281 MB  130 MB
;   192 MB  1889 MB  194 MB
AllowRootDirInstall true
!ifdef G2MDK_SMALL
!packhdr "packhdr.tmp" "upx --best packhdr.tmp"
!endif


; Includes
!include "MUI.nsh"
!include "Sections.nsh"
!include ".\setup\g2mod.nsh"


; Version Definitions
!define VER_MAJOR 0
!define VER_MINOR 0
!define VER_PATCH 0
!define VER_FLAGS 0

!define VER_TEXT  "${VER_MAJOR}.${VER_MINOR}"
!ifndef G2MDK_SMALL
!define VER_FILE  "${VER_MAJOR}.${VER_MINOR}"
!else
!define VER_FILE  "${VER_MAJOR}.${VER_MINOR}"
!endif

!define NAME_LONG "Modification Development Kit"
!define UNREG_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\MDK"

OutFile "..."
InstallDir "..."
InstallDirRegKey HKLM "..."


;===============================================================================
;   MUI

Name "G2MDK ${VER_TEXT}"
;BrandingText "${NAME_LONG}"
;LicenseForceSelection radiobuttons


; Configuration (all)
!ifdef MDK_COLOR
  !define MUI_BGCOLOR "000000"
  !define MUI_TEXTCOLOR "CDCBEB"
  !define MUI_FINISHPAGE_LINK_COLOR "0xFDF8F8"
!endif
!define MUI_ICON ".ico"
!define MUI_UNICON ".ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_RIGHT
!define MUI_HEADERIMAGE_BITMAP ".bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP ".bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP ".bmp"

; Configuration (Installer)
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TEXT "Dieser Assistent wird Sie durch die Installation \
  von MDK (${NAME_LONG}) begleiten.\r\n\r\nEs wird empfohlen vor der \
  Installation alle anderen Programme zu schlieЯen.\r\n\r\n$_CLICK"
!define MUI_FINISHPAGE_NOREBOOTSUPPORT
!define MUI_FINISHPAGE_TITLE_3LINES
!define MUI_FINISHPAGE_LINK "..."
!define MUI_FINISHPAGE_LINK_LOCATION "..."

; Setup Pages (Installer)
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".rtf"
Page custom PageReinstall PageLeaveReinstall
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

; Configuration (Uninstaller)
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TEXT "Dieser Assistent wird Sie durch die \
  Deinstallation von GMDK (${NAME_LONG}) begleiten.\r\n\r\n\
  Bitte beenden Sie alle MDK-Tools,\r\n\
  bevor Sie mit der Deinstallation fortfahren.\r\n\r\n$_CLICK"
!define MUI_FINISHPAGE_TITLE_3LINES

; Setup Pages (Uninstaller)
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH

; Setup Language
!insertmacro MUI_LANGUAGE "German"

; Reserve Files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
...


Код восстанавливал изучая оригинал(написан на базе Нсиськи 2.0), сам использую Нсис юникод 2.46.5.
Компилил как в Анси, так и в Юнике, и взде одинаково, - текст не отображается..
В чем грабля может быть ?!

Отправлено: 07:48, 15-03-2015 | #1542


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

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


Contributor


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

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


Цитата MaGoth:
Не отображаются тексты на странице Велком и её заголовка.. »
Они отображаются, просто цвет текста к этому тексту не применяется, у вас заливается черным фоном и текст тоже остаётся черным.

Цитата MaGoth:
В чем грабля может быть ?! »
В том, что дефинька:
Цитата MaGoth:
!define MUI_TEXTCOLOR »
вообще в NSIS не существует, ни в 2.46 ни в 3.0b1, ни в документации о ней не сказано, ни в include файлах настроек интерфейсов её нет

MUI_BGCOLOR есть, а вот MUI_TEXTCOLOR нет, соответственно, цвет на фон то применяется, а на текст - нет
Пишите свою функцию с установкой цветов на тексты командой SetCtlColors, либо ковыряйте include файл интерфейса и добавляйте такую дефиньку, чтобы применяла цвета на текст

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


Последний раз редактировалось K.A.V., 15-03-2015 в 11:00.

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

Отправлено: 10:54, 15-03-2015 | #1543


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


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

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


K.A.V.,
Не напомнишь случаем хенделы этих текстовых полей и окна..? Ковырял ковырял интерфес, но что-то кроме как изменения цвета фона в них, ничего более не наковырял. Может ковырялка не того калибра ?!
Да и залезть в ресурсы интерфейса пока нет возможности...

Отправлено: 08:39, 20-03-2015 | #1544


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

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


Contributor


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

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


Цитата MaGoth:
Да и залезть в ресурсы интерфейса пока нет возможности... »
Я вам про ресурсы и не говорил...

Цитата K.A.V.:
include файл интерфейса »
Код: Выделить весь код
!include "MUI.nsh"
который перенаправляет нас в
Код: Выделить весь код
C:\Program Files (x86)\NSIS\Contrib\Modern UI\System.nsh
в котором прописаны все детали интерфейса, установка цветов, текста, изображений и т.д.

Цитата MaGoth:
Не напомнишь случаем хенделы этих текстовых полей и окна..? »
Если речь идёт о странице приветствия и финиша - то там по-другому они получаются, т.к. странички эти создаются с помощью InstallOptions, хэндлы элементов можно получить чтением данных из INI файла настроек ($PLUGINSDIR\ioSpecial.ini), который создаётся перед показом страницы приветствия/финиша, сделать это можно в функции
Код: Выделить весь код
MUI_PAGE_CUSTOMFUNCTION_SHOW
В своём коде замените ваши куски этими:
Код: Выделить весь код
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishColors_K.A.V._Example"
; Setup Pages (Installer)
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".rtf"
Page custom PageReinstall PageLeaveReinstall
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_PAGE_FINISH
Код: Выделить весь код
; Setup Pages (Uninstaller)  
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "un.WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "un.WelcomeFinishColors_K.A.V._Example"
!insertmacro MUI_UNPAGE_FINISH
Обратите внимание, что необходимо прописывать CUSTOMFUNCTION и перед страничкой приветствия, и перед страничкой финиша
И ещё обратите внимание на то, что необходимо использовать 2 разные функции для установщика и деинсталлятора

сами функции
Код: Выделить весь код
Function WelcomeFinishColors_K.A.V._Example
  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 2" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 3" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

GetDlgItem $0 $HWNDPARENT 1037
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1038
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}   
FunctionEnd


Function un.WelcomeFinishColors_K.A.V._Example
  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 2" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

  ReadINIStr $0 "$PLUGINSDIR\ioSpecial.ini" "Field 3" "HWND"
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}

GetDlgItem $0 $HWNDPARENT 1037
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}
GetDlgItem $0 $HWNDPARENT 1038
  SetCtlColors $0 ${MUI_TEXTCOLOR} ${MUI_BGCOLOR}   
FunctionEnd

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

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

Отправлено: 12:19, 20-03-2015 | #1545


Аватара для Limonica

Старожил


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

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


Как определить за NAT находится пк или нет с помощью NSIS?

Отправлено: 12:06, 30-03-2015 | #1546


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

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


Contributor


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

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


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

Так вот что хотелось бы сказать в итоге (и, думаю, нужно внести эти "пожелания-инструкции" в шапку в каком-нибудь более понятном формате, если я не очень грамотно выражусь сейчас):
Если вы просите помощи в написании кода, описывайте подробно, какие команды необходимо видеть в коде, т.к. не все мы тут супер-мега-опытные-знающие всё обо всём в мире IT, сократите время ожидания кода себе и уважайте время тех, кто вам помогает.
Например, по вашему вопросу можно было бы составить сообщение типа такого (опять же, если я всё правильно понял про NAT, прочитав инфу в инете):
Скрытый текст

Как определить за NAT находится пк или нет с помощью NSIS? Если готового решения нет, то необходим следующий функционал:
1. Определить IP адрес локальной машины
2. Определить, входит ли этот адрес в диапазоны локальных зарезервированных сетей типа 192.168.255.255, 10.255.255.255 и бла бла бла перечисляем дальше


Т.е. по сути, нам что нужно, определить это? Если IP адрес компьютера входит в диапазон локальных сетей, то мы за NAT?
Если я всё правильно понял, то можно реализовать так (или не так, если я всё-таки нифига не понял ):
В любом случае, может быть, код кому-нибудь пригодится, если это не решение вашего вопроса)

Код: Выделить весь код
Name "GetIP Test"
OutFile "GetIP Test.exe"
 
Function .onInit
call GetIP
quit
FunctionEnd
              
Function GetIP
System::Alloc 400
pop $R0
System::Call 'ws2_32::WSAStartup(i 0x202, i R0)'
System::Call 'ws2_32::gethostname(t .r0, i ${NSIS_MAX_STRLEN}) i .r1'
System::Call 'ws2_32::gethostbyname(t "$0") i.R1'
System::Call '*$R1(&v12,*i.R2)'  
System::Call '*$R2(i.R3)'
System::Call 'ws2_32::inet_ntoa(i R3) t.R4' 
System::Call 'ws2_32::WSACleanup()'
System::Free $R0
; $0 - имя хоста
; $R4 - IP адрес

Push '$R4'
Call CheckIP
Pop $0
; в $0 результат, смотрим инфу ниже:
;         1 - LoopBack IP (localhost, indicates no connection to a LAN or to the internet).
;         2 - Automatic Private IP Address (no DHCP server).
;         3 - Network IP.
;         4 - Internet IP.
 StrCpy $1 "Мы за NAT"
 StrCmp $0 "4" 0 +2
 StrCpy $1 "Мы не за NAT"
 MessageBox MB_OK|MB_ICONINFORMATION "IP - $R4$\noutput - $0$\n$\n$1"
FunctionEnd


Function CheckIP
  Exch $0
  Push $1
 
  ; Check 127.x.x.x
  Push '127.0.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range1     ; IP cannot be in range of LoopBack addresses
  Push '127.255.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LoopBack      ; We found a LoopBack IP
 
  ; Check 10.x.x.x
  Range1:
  Push '10.0.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range2     ; IP cannot be in range 1
  Push '10.255.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LanIp         ; We found a LanIp
 
  ; Check 172.16.x.x to 172.31.x.x
  Range2:
  Push '172.16.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range3     ; IP cannot be in range 2
  Push '172.31.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LanIp         ; We found a LanIp
 
  ; Check 192.168.x.x
  Range3:
  Push '192.168.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' Range4     ; IP cannot be in range 3
  Push '192.168.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 LanIp         ; We found a LanIp
 
  ; Check 169.254.x.x
  Range4:
  Push '169.254.0.0'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 2 '' InternetIp ; It should be an internet IP
  Push '169.254.255.255'
  Push $0
  Call VersionCheck
  Pop $1
  StrCmp $1 1 APA           ; We found an Automatic Private IP Address
 
  Goto InternetIp           ; Remaining addresses are internet IPs
 
  LoopBack:
  StrCpy $1 1
  Goto Exit
 
  APA:
  StrCpy $1 2
  Goto Exit
 
  LanIp:
  StrCpy $1 3
  Goto Exit
 
  InternetIp:
  StrCpy $1 4
 
  Exit:
  Exch $1
  Exch 1
  Exch $0
  Exch 1
FunctionEnd


Function VersionCheck
  Exch $0 ;second versionnumber
  Exch
  Exch $1 ;first versionnumber
  Push $R0 ;counter for $0
  Push $R1 ;counter for $1
  Push $3 ;temp char
  Push $4 ;temp string for $0
  Push $5 ;temp string for $1
  StrCpy $R0 "-1"
  StrCpy $R1 "-1"
  Start:
  StrCpy $4 ""
  DotLoop0:
  IntOp $R0 $R0 + 1
  StrCpy $3 $0 1 $R0
  StrCmp $3 "" DotFound0
  StrCmp $3 "." DotFound0
  StrCpy $4 $4$3
  Goto DotLoop0
  DotFound0:
  StrCpy $5 ""
  DotLoop1:
  IntOp $R1 $R1 + 1
  StrCpy $3 $1 1 $R1
  StrCmp $3 "" DotFound1
  StrCmp $3 "." DotFound1
  StrCpy $5 $5$3
  Goto DotLoop1
  DotFound1:
  Strcmp $4 "" 0 Not4
    StrCmp $5 "" Equal
    Goto Ver2Less
  Not4:
  StrCmp $5 "" Ver2More
  IntCmp $4 $5 Start Ver2Less Ver2More
  Equal:
  StrCpy $0 "0"
  Goto Finish
  Ver2Less:
  StrCpy $0 "1"
  Goto Finish
  Ver2More:
  StrCpy $0 "2"
  Finish:
  Pop $5
  Pop $4
  Pop $3
  Pop $R1
  Pop $R0
  Pop $1
  Exch $0
FunctionEnd

Section  
SectionEnd

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

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

Отправлено: 17:21, 30-03-2015 | #1547

MKN MKN вне форума

Ветеран


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

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


Необходимо переименовать все файлы в папке, чтобы вместо имён была нумерация ( варианты 0,1,2 и т.д. или 01, 02 и т.д. или 001 002 и т.д. ) без расширений
Также интересует выборочное переименование , типа, переимен. начиная с такого то по такой то файл и др сочетания...
Использовал такой код :
Код: Выделить весь код
outfile rename_enumerate-test.exe
Var /global n

Section
StrCpy $n 0
ClearErrors
FindFirst $0 $1 $EXEDIR\D\*.*
loop:
StrCmp $1 "" done
Rename "$EXEDIR\D\$1" "$EXEDIR\D\$n"
FindNext $0 $1
IntOp $n $n + 1
Goto loop
done:
FindClose $0
SectionEnd
Но почему то получается хаотичное переименование, особенно если много файлов...

Последний раз редактировалось MKN, 31-03-2015 в 17:06.


Отправлено: 17:00, 31-03-2015 | #1548


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

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


Contributor


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

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


Код: Выделить весь код
Function RenameFiles  
Var /global n 
StrCpy $n 1  
Delete "$TEMP\tmpfile.ini"

ClearErrors
FindFirst $0 $1 $DESKTOP\D\*.*
loop:
StrCmp $1 "" done
StrCmp $1 "." next
StrCmp $1 ".." next

ReadINIStr $2 "$TEMP\tmpfile.ini" "tmp" "$1"
StrCmp $2 "1" next 0 

Rename "$DESKTOP\D\$1" "$DESKTOP\D\$n"
WriteINIStr "$TEMP\tmpfile.ini" "tmp" "$n" "1"
IntOp $n $n + 1   

next:
FindNext $0 $1
Goto loop
done:
FindClose $0
Delete "$TEMP\tmpfile.ini"
FunctionEnd
Цитата MKN:
Но почему то получается хаотичное переименование, особенно если много файлов... »
Ты упустил 1 очень важный момент: после переименования файл считается "новым", т.е. ещё не перечисленным, отсюда такой результат, переименованные файлы вновь перечисляются и получается каша в именах, поэтому код отрабатывает не так, как нам бы хотелось
Соответственно, чтобы сделать этот процесс правильным - нам нужно запоминать, какой файл уже был переименован (чтобы повторно его не обрабатывать), для этого сбрасываем имена переименованных файлов во временный файл и перед каждой командой переименования проверяем наличие записи о текущем файле
Ещё один момент, когда перечисляешь все файлы в папке командой Find*, в переменную имени файла сбрасывается значение "." и "..", из-за чего счетчик так же может быть не правильным, проверку на эти значения я так же прописал
Ну и ещё один момент - счетчик нужно менять только после операции переименования, а не после/перед командой FindNext, т.к. опять же, счетчик будет не правильным

Цитата MKN:
Также интересует выборочное переименование , типа, переимен. начиная с такого то по такой то файл и др сочетания... »
Типа будет конкретика - будет и код, нет желания потом опять переписывать код по причине недопонимания/недостаточности подробностей

p.s.
я бы вообще, сделал всё это дело через функцию Locate (красивее/удобнее), но т.к. она багованная с самого 2.46 и при указании некоторых команд (например ReadINIStr) в callback функцию, она просто завершается - из-за этого этот вариант отпадает

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

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

Отправлено: 18:31, 31-03-2015 | #1549

MKN MKN вне форума

Ветеран


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

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


Цитата K.A.V.:
после переименования файл считается "новым", т.е. ещё не перечисленным, отсюда такой результат »
я где то читал, чтобы избежать этого, после переименования файл(ы) сразу же перемещают в другую папку.
Наверное такое переименование проще сделать батником. Там это в три строки делается...

Последний раз редактировалось MKN, 01-04-2015 в 12:22.


Отправлено: 18:44, 31-03-2015 | #1550



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




 
Переход