Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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} вложен в логику, для того, чтобы текст не превратился в одну строчку :)
кто подскажет, как правильно написать в скрипте такую команду "bin\javaw.exe -jar JDownloader.jar"
kotkovets
28-03-2011, 15:49
кто подскажет, как правильно написать в скрипте такую команду "bin\javaw.exe -jar JDownloader.jar" »
подробней где и как, зачем?
подробней где и как, зачем? »
для лаунчера, как в 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 - возвращает текущий путь "иницилизатора" запуска
Можно так: »
что-то не хочет((
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC