PDA

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


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

martinello
25-03-2011, 00:05
Доброго времени суток!

При создании аддона с помощью NSIS возникла необходимость читать значения ключа из реестра по "плавающему" пути.
Значение ключа KEY лежит в HKEY_LOCAL_MACHINE\Software\Alter\ВЕРСИЯ\Prog . где "ВЕРСИЯ" - версия программы, которая
может быть любой и постоянно меняется... Как в этом случае можно считать значение ключа KEY?

Заранее спасибо.

kotkovets
25-03-2011, 00:18
martinello
Только в цикле с перечислением ключей и значений выбранной ветки реестра EnumRegKey или EnumRegValue
И кстати приведите несколько значений "ВЕРСИЯ" что-то должно совпадать.
либо в начале или в конце строки, что-то общее должно быть и дальше методом сравнения общего, прочитать значение ключа.
Как то так...

martinello
25-03-2011, 09:40
kotkovets
Примеры ВЕРСИЯ: 10.0, 10.4, 11.8, 12.3, 13.0, 14.7 и т.д. Из общего тут, вроде только точка в третьем разряде. Версий уже слишком много вышло, да и выйдет еще множество, поэтому просто завязываться на конкретное поле - не самый лучший вариант. Все ведь не перечислишь. И для будущих версий тоже должно работать... Вот и ломаю голову.

kotkovets
25-03-2011, 14:35
Все ведь не перечислишь »
Может быть, но кое-что все же, можно сделать.
По сути значения "версия" состоит из 3 цифр и четырех символов.
1. Натравливаем в цикле с перечислением, фильтр, который отсекает все значения, кроме числовых.
2. Проверяем длину строк на 4 символа, все остальное отсекаем.
3. У нас уже есть путь к ветке реестра, можем уже считывать ключи реестра
Недостаток в том, если есть еще ветки удовлетворяющим условиям, то будут ложные данные считаны
И довольно все это сложно перемудрено не туда...
!include "MUI2.nsh"
!include "WordFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

OutFile "StrDo.exe"
ShowInstDetails show

Section
${Do}
;перечисляем разделы в ветке After (разделы в $1)
EnumRegKey $1 HKLM "SOFTWARE\After" $0
IntOp $0 $0 + 1
${StrFilter} "$1" "1" "." "" "$2" ;фильтр: только цифры и точка в $2
StrLen $3 $2 ;вычисляем длину строки в $3
${IfNot} $2 == "" ; оператор If с условием, если $2 не равно пустому значению
${AndIf} $3 = 4 ; логика И (если $2 не равно пустому значению И длина строки $3 = 4)
DetailPrint "найденный раздел: $1"
ReadRegStr $4 HKLM "SOFTWARE\After\$1\Prog" "Key" ;теперь можно считывать значения ключеей (к примеру: Key)
DetailPrint `Значение ключа [ Key ] - "$4"`
${Break} ;выход из цикла
${EndIf}
${LoopUntil} $1 == ""
SectionEnd

martinello
25-03-2011, 17:12
И довольно все это сложно перемудрено не туда... »
Это верно...
Решил проблему с помощью плагина Registry для NSIS http://nsis.sourceforge.net/Registry_plug-in
В итоге открываю ветку для поиска HKEY_LOCAL_MACHINE\Software\Alter и ищу в ней тот самый KEY.
Спасибо за код, он пригодится как пример для похожих подзадач :)

martinello
27-03-2011, 13:23
Доброго времени суток!

Кто-нибудь знает, есть ли возможность изменения текста на начальной странице удаления MUI_UNPAGE_WELCOME
и на конечной странице удаления MUI_UNPAGE_FINISH ?
В справке об этом молчок... Упоминается почему-то только страница подтверждения MUI_UNPAGE_CONFIRM.
Правда, есть еще UninstallText, но его включение никаким образом не влияет ни на одну надпись (или я не так им пользуюсь).

Заранее спасибо.

kotkovets
27-03-2011, 14:39
Кто-нибудь знает, есть ли возможность изменения текста на начальной странице удаления MUI_UNPAGE_WELCOME »
Достаточно соответствующие хедеры посмотреть. Для MUI2 [Welcome.nsh] - одинаково и для MUI [System.nsh] :
!define MUI_UNTEXT_WELCOME_INFO_TITLE "Всем привет!"
!define MUI_UNTEXT_WELCOME_INFO_TEXT "Это моя супер прога!"
UninstallText text [subtext] - применяется при классическом фейсе, на страничке confirm page, на модерне напрямую эта команда игнорируется, потому что "заменена" константами !define
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
В NSIS нет стандартных страничек приветствия и завершения. Эти странички "самодельные" и прорисовываются через nsDialogs - для MUI2, и через InstallOptions - для MUI, при классике выбрать можно любой из этих стандартных плагинов в комлекте NSIS

martinello
27-03-2011, 18:14
Достаточно соответствующие хедеры посмотреть. Для MUI2 [Welcome.nsh] - одинаково и для MUI [System.nsh] : »

Спасибо огромное за помощь! :) Про хедеры совсем из головы вылетело...

Столкнулся с другой проблемой. Нужно в текстовом файле искать строки, добавлять, удалять.
Если с поиском и вставкой проблем нет, то вот полностью удалить строку не получается - после
удаления в файле на этом месте образуется пустой абзац (строка без символов).
Делал через ${LineFind} и ${WordReplace}.
Как можно полностью удалить найденную строчку?..

kotkovets
27-03-2011, 20:03
martinello
В NSIS пустая строка означает: $\r$\n
$\n - создание новой строки
$\r - перевод каретки на начало строки
$\t - знак табуляции
Те самые невидимые символы строки. Через макрос ${LineFind} вот так будет это выглядеть:

${WordReplace} '$R9' 'Строка' '' "+" '$R9'
${Select} "$R9"
${Case3} "$\r$\n" "$\r" "$\n"
${WordReplace} '$R9' '$R9' '' "+" '$R9'
${CaseElse}
${EndSelect}
Так как идет построчное чтение файла, то пустые строки удалятся, кроме последней (особо то и не нужно)
Макрос ${WordReplace} вложен в логику, для того, чтобы текст не превратился в одну строчку :)

punsh
28-03-2011, 15:12
кто подскажет, как правильно написать в скрипте такую команду "bin\javaw.exe -jar JDownloader.jar"

kotkovets
28-03-2011, 15:49
кто подскажет, как правильно написать в скрипте такую команду "bin\javaw.exe -jar JDownloader.jar" »
подробней где и как, зачем?

punsh
28-03-2011, 15:54
подробней где и как, зачем? »
для лаунчера, как в PortableApps

нужно запустить JDownloader.exe, если уже есть в папке java !

kotkovets
28-03-2011, 16:07
Можно так:
ExecWait '"$EXEDIR\bin\javaw.exe" -jar JDownloader.jar'
или так
nsExec::Exec '"$EXEDIR\bin\javaw.exe" -jar JDownloader.jar'
$EXEDIR - возвращает текущий путь "иницилизатора" запуска

punsh
28-03-2011, 22:59
Можно так: »
что-то не хочет((

wolkow70
03-04-2011, 08:24
ТОварищи подскажите ответ на такой вопрос: Программа в данном случае Firefox в каждой конфигурации создает папку для профиля со случайным названием XXXXXX.defolt.

Можно ли для скрипта присвоить этой папке переменное имя после проверки наличия в ней маркерного файла Extension.ini, и в дальнейшем использовать уже переменное название?

kotkovets
03-04-2011, 12:23
Можно ли для скрипта присвоить этой папке переменное имя »
Элементарно! в справке все это есть - наберите по индексу Locate - есть пример.
К примеру предположительно Extension.ini лежит в папке C:\Firefox, где в этой папке еще папки с неизвестными именами.
Скрипт рекурсивно перерыщет все каталоги папке C:\Firefox, пока не найдет нужный файл. Если файл не найдет - установится флаг ошибки (в скрипте не будет сообщения)
!include "FileFunc.nsh"
ShowInstDetails show
outfile test.exe

Section
${Locate} "C:\Firefox" "/L=FDE /M=Extension.ini" "Find"
IfErrors +2
MessageBox MB_OK '$$R0 = "$R0" $\n$\r$$R1 = "$R1"' IDOK
SectionEnd

Function Find
StrCpy $R0 $R8
StrCpy $R1 $R9
Push $0
FunctionEnd

wolkow70
03-04-2011, 13:07
К примеру предположительно Extension.ini лежит в папке C:\Firefox »
Проблема в том, что сам Extension.ini лежит в папке со случайным названием "c0rkpcd2.default"
И как к этому файлу и этой папке указать путь, если абсолютный путь:

E:\Documents and Settings\Anton.OOO-940B41D8143\Application Data\Mozilla\Firefox\Profiles\c0rkpcd2.default

kotkovets
03-04-2011, 13:11
wolkow70
!include "FileFunc.nsh"
ShowInstDetails show
outfile test.exe

var path
Section
SetShellVarContext all #папка документы для всех пользователей
${GetParent} "$DOCUMENTS" $R2
${GetParent} $R2 $path
MessageBox MB_OK "$path" IDOK
${Locate} "$path" "/L=FDE /M=Extension.ini" "Find"
IfErrors +2
MessageBox MB_OK '$$R0 = "$R0" $\n$\r$$R1 = "$R1"' IDOK
SectionEnd

Function Find
StrCpy $R0 $R8
StrCpy $R1 $R9
Push $0
FunctionEnd

wolkow70
03-04-2011, 13:25
SetShellVarContext all #папка документы для всех пользователей
${GetParent} "$DOCUMENTS" $R2
${GetParent} "$R2" $R2
MessageBox MB_OK "$R2" IDOK
${Locate} "$R2" "/L=FDE /M=Extension.ini" "Find" »

То есть папка c0rkpcd2.default получит переменное значение "$R2", если в ней найден файл Extension.ini ?
Мне в этот файл нужно автоматом прописать строки с путями к новым плагинам. Но это я уже научился делать используя абсолютный путь.

kotkovets
03-04-2011, 13:30
То есть папка c0rkpcd2.default получит переменное значение "$R2", если в ней найден файл Extension.ini ? »
${GetParent} "$DOCUMENTS" $R2
${GetParent} $R2 $path
Мы подымаемся на 2 уровня вверх и получаем корневую папку, где будет Extension.ini




© OSzone.net 2001-2012