PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 [58] 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

Limonica
17-04-2014, 09:45
Исходные данные:
TXT файл с одной изменяющейся числовой строкой.

Задача:
Проверить есть ли числовая строка в этом тестовом файле, если нет, то крутится в цикле ожидая появления.

Решение:
Читаем строку, заносим в переменную, ну а дальше как сравнить появилось число или нет?

!include "Logiclib.nsh"

OutFile "line.exe"
SilentInstall silent
RequestExecutionLevel user
Section
${LineRead} "id.log" "1" $1

${If} $1 == "ID=(пусто)"
MessageBox MB_OK "$1 error"
${ElseIf} $1 == "ID=(какое то число)"
MessageBox MB_OK "$1 susses"
${EndIf}
SectionEnd

Такой код само собой не работает, знатоки прошу помощи!

Содержимое id.log:

ID=

или

ID=какое то число

Kopejkin
17-04-2014, 10:08
...с лету не нашел »
Тогда хватит летать! Идите на посадку и не спеша начинайте читать:
Перевод справки NSIS => LineRead: читаем содержимое строки по номеру »
Там же:
Справочник NSIS -> Примеры кодов -> Работа со строками;
Справочник NSIS -> Примеры кодов -> Замена строки в текстовом файле;
Попробуйте подогнать под свои цели. А не получится - неработающий код сюда.
По крайней мере, так будет более понятно, что вы хотели сделать.

K.A.V.
17-04-2014, 10:12
Такой код само собой не работает, знатоки прошу помощи! »
Ну, само собой...В переменную заносится значение всей строки целиком, это же не параметр в секции INI файла, чтобы сразу прочиталось то, что идёт после знака "="
Следовательно, вам нужно самому фильтровать строку и вытаскивать значение из строки.

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

Имеем: строку вида "ID=какое то число"
Вопрос: как получить значение, которое идёт после символа "="
Ответ: вспоминаем стандартную и простую команду StrCpy (описание есть в справочнике)
В нашем случае мы используем её для отсеивания первых трёх символов строки, чтобы получить значение "типа параметра ID"
${LineRead} "id.log" "1" $1
StrCpy $1 "$1" "" 3

Пример функции, которая ждёт появления в значении вашей строки числа 687
Function LineReadFunc
start:
Sleep 1000
${LineRead} "id.log" "1" $1
StrCpy $1 "$1" "" 3
StrCmp $1 "" start 0
StrCmp $1 "687" 0 start
MessageBox MB_OK|MB_ICONINFORMATION "Число 687 появилось, конец функции"
FunctionEnd

Kopejkin
17-04-2014, 10:26
Не в тему, но давно хотел спросить о работе текстового редактора форума.

Почему при редактировании сообщения слетает форматирование?


Отправляю такое:

http://savepic.org/5368102.png

Если хочу отредактировать, то в расширенном редакторе вижу уже такое :lamer:

http://savepic.org/5372198.png

K.A.V.
17-04-2014, 10:33
Не в тему »
Вам в раздел О сайте и форуме (http://forum.oszone.net/forum-17.html)

Почему при редактировании сообщения слетает форматирование? »
У меня проблем нет. Opera 12.16

kotompazb
18-04-2014, 08:17
Здравствуйте.
Начал разбираться с NSIS и тут же уперся.
Банальная, думаю, задача.
Надо прочитать номер версии файла, поместить результат в name и в инсталлятор.

Делаю так:

!define PRODUCT_NAME "MyProg"
!define PRODUCT_PUBLISHER "MyCorp"
!define EXE_FULL_NAME "D:\4inst\prog.exe"
var PROD_VERSION

Name "${PRODUCT_NAME} v$PROD_VERSION"

...

VIProductVersion "1.0.0.0"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${PROD_VERSION}"
VIAddVersionKey "FileVersion" "1.0.0.0"

...

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
!include "FileFunc.nsh"
${GetFileVersion} "${EXE_FULL_NAME}" $R0
StrCpy $PROD_VERSION $R0
FunctionEnd


Получаю очень неожиданный (для меня) результат: При установке все так как должно быть: "Вас приветствует мастер установки MyProg v1.0.0.0"... Однако, когда запускаешь деисталлятор, номер версии теряется: "Вы уверены в том, что желаете удалить MyProg v и все компоненты..."

А с записью информации о версии в инсталлятор совсем ничего не выходит, пока не укажу номер версии явно.

K.A.V.
18-04-2014, 08:44
Надо прочитать номер версии файла, поместить результат в name и в инсталлятор. »
Внешнего файла, не зависимого от пакета установки? И версию этого файла используете в инсталляторе/деинсталляторе как версию вашего устанавливаемого/удаляемого приложения?
Если да, то...зачем? Можно 1 раз указать версию файла в скрипте и потом использовать везде переменные
!define PRODUCT_VERSION "2.3.4.5"

VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"

Однако, когда запускаешь деисталлятор, номер версии теряется »
Всё правильно, функция .onInit используется только при инициализации программы установки, чтобы прописать команды в функцию инициализации программы удаления, используйте функцию un.onInit, т.е. в вашем случае вам нужно продублировать функцию .onInit и присвоить второй функции имя un.onInit

kotompazb
18-04-2014, 09:10
Внешнего файла, не зависимого от пакета установки? И версию этого файла используете в инсталляторе/деинсталляторе как версию вашего устанавливаемого/удаляемого приложения?
Если да, то...зачем? Можно 1 раз указать версию файла в скрипте и потом использовать везде переменные »
Не независимого, а устанавливаемого, то есть версия устанавливаемого пишется в версию инсталлера, чтобы вручную ее не переписывать каждый раз - получится неизменный скрипт.
Всё правильно, функция .onInit используется только при инициализации программы установки, чтобы прописать команды в функцию инициализации программы удаления, используйте функцию un.onInit, т.е. в вашем случае вам нужно продублировать функцию .onInit и присвоить второй функции имя un.onInit »
Вот за это спасибо. Так и знал, что ошибка где-то на поверхности.

K.A.V.
18-04-2014, 10:40
получится неизменный скрипт. »
Получится багованный код у вас, при условии, что перед получением версии файла, указанный вами файл не существует на диске.

Код, который вы прописали, будет срабатывать тогда, когда пользователь запустит ваш пакет инсталлятора, соответственно, исходя из вашего кода, ваш пакет инсталлятора при запуске будет читать версию файла по пути "D:\4inst\prog.exe", это есть изначальный баг вашего кода, т.к. данного файла у пользователя на компе просто напросто не будет. Если же вы распаковали указанный файл и потом проверяете его версию - другой разговор.
А судя по вашему текущему коду, у меня складывается такое впечатление, будто вы думаете, что в процессе создания EXE-файла пакета инсталлятора версия указанного файла "зашивается" в код вашего пакета инсталлятора и запоминается - это не так.

kotompazb
18-04-2014, 11:10
Код, который вы прописали, будет срабатывать тогда, когда пользователь запустит ваш пакет инсталлятора, соответственно, исходя из вашего кода, ваш пакет инсталлятора при запуске будет читать версию файла по пути "D:\4inst\prog.exe", это есть изначальный баг вашего кода, т.к. данного файла у пользователя на компе просто напросто не будет. »
Факт же. Вывод: ночью надо спать. А нет ли какого-то способа сохранить версию, в процессе создания инсталятора все-таки?

K.A.V.
18-04-2014, 11:31
А нет ли какого-то способа сохранить версию, в процессе создания инсталятора все-таки? »
Можно вот так сделать:
Прописываем полный путь к файлу, у которого будет определяться версия
В константу PRODUCT_VERSION (в коде при необходимости использовать как ${PRODUCT_VERSION}) будет помещена версия файла в формате X.X.X.X
Также будет автоматически генерироваться имя выходного файла с версией в формате "setup_X.X.X.X.exe" и информация о версии файла инсталлятора (в коде выделено жирным)



!getdllversion "C:\Users\APTEM\Desktop\TEST.exe" expv_
!define PRODUCT_VERSION "${expv_1}.${expv_2}.${expv_3}.${expv_4}"


; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "Моя программа"
!define PRODUCT_PUBLISHER "Моя компания, LLC."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "Russian"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "setup_${PRODUCT_VERSION}.exe"
InstallDir "$PROGRAMFILES\Моя программа"
ShowInstDetails show
ShowUnInstDetails show

VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey "LegalCopyright" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "CompanyName" "${PRODUCT_PUBLISHER}"
VIAddVersionKey "FileDescription" "${PRODUCT_NAME} ${PRODUCT_VERSION}"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"


Section "MainSection" SEC01
SectionEnd

Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd


Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "Удаление программы $(^Name) было успешно завершено."
FunctionEnd

Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы уверены в том, что желаете удалить $(^Name) и все компоненты программы?" IDYES +2
Abort
FunctionEnd

Section Uninstall
Delete "$INSTDIR\uninst.exe"


DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SetAutoClose true
SectionEnd

alexfinik
22-04-2014, 17:54
Р*то РїСЂ »
может наоборот? У меня ровно наоборот.
У вас 32бита винда.Может у меня проблема из-за 64бита?

4eshireCat
22-04-2014, 21:03
может наоборот? У меня ровно наоборот.
У вас 32бита винда.Может у меня проблема из-за 64бита? »

Винда у меня тоже 64. Работаю с NSIS 3.0a2, но перепроверил также на v.2.46 - все именно так, как я писал ранее. В ANSI компилируется нормально, в Unicode вместо русского - "иероглифы". Разрядность ОС тут не при чем - на х86 результат аналогичный. Так что в чем тут дело мне не известно... Возможно у вас что-то с кодировками в системе напутано, т.к. даже моя цитата в вашем сообщении выглядит весьма загадочно :)
Попробуйте скомпилить под виртуалкой или на другом компе.

wolkow70
25-04-2014, 12:54
Товарищи, кто-нибудь знает как при выполнении функции замены фразы в текстовом файле (StrFunc.nsh) сделать так, что бы временный файл для обработки создавался не в папке с самим инсталлятором, а в другом месте, например во временной папке $TEMP?
Выполняются команды:
StrCpy $_FindInFile '' ; Заменяем строки в этом файле
StrCpy $_LineReplace '' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '' ; На что будем заменять
Call ReplaceLinesInFile

K.A.V.
25-04-2014, 13:31
Товарищи, кто-нибудь знает как при выполнении функции замены фразы в текстовом файле (StrFunc.nsh) сделать так, что бы временный файл для обработки создавался не в папке с самим инсталлятором, а в другом месте, например во временной папке $TEMP? »
Перед вызовом функции замены фразы подмените значение переменной $EXEDIR
Только не забудьте после отработки функции вернуть значение обратно, иначе проблем можете повидать с неправильными путями и с некорректной работой установщика



var /global _EXEDIR
StrCpy "$_EXEDIR" "$EXEDIR"
StrCpy "$EXEDIR" "$TEMP"

StrCpy $_FindInFile '' ; Заменяем строки в этом файле
StrCpy $_LineReplace '' ; Ищем и заменяем ЭТУ строку
StrCpy $_LineToInsert '' ; На что будем заменять
Call ReplaceLinesInFile

StrCpy "$EXEDIR" "$_EXEDIR"

wolkow70
25-04-2014, 13:49
Перед вызовом функции замены фразы подмените значение переменной $EXEDIR »

Да, работает. Хотя, странно, ведь в самом хедере StrFunc.nsh переменная $EXEDIR не встречается в функциях...

kotkovets
25-04-2014, 14:47
$EXEDIR не встречается в функциях. »
StrCpy "$EXEDIR" "$TEMP" »
StrFunc.nsh использует переменную $TEMP, перед началом значение "$EXEDIR" копируется в перемееную $TEMP
c ней то и работает StrFunc - а значение $TEMP уже подкорректировано.. перед использованием

Limonica
27-04-2014, 14:59
Задача, проверить по какому интерфейсу раздаётся интернет и вывести MessageBox:

ethernet

wrisless

mobile

Как можно реализовать?

MKN
27-04-2014, 17:04
Limonica, по какому интерфейсу раздаётся интернет »
http://nsis.sourceforge.net/IpConfig_plugin#GetNetworkAdapterType
http://nsis.sourceforge.net/IpConfig_plugin#GetNetworkAdapterConnectionID
http://msdn.microsoft.com/en-us/library/aa394216.aspx

Limonica
28-04-2014, 10:28
А как однозначно проверить входит ПК в домен или нет, и вывести MessageBox:

ПК состоит в домене Domain.

ПК не состоит в домене.




© OSzone.net 2001-2012