Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Привет всем.
Не как не могу разобраться с разбором строк...
Из реестра считывается строка вида:
Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;Min Pool Size=5;
либо
Provider=LCPI.IBProvider;Data Source=localhost:C:\Program Files\user\DB\user_db.gdb;ctype=win1251;auto_commit=true;auto_commit_level=0x1000;User ID=user;Password=user;
По значению "Provider=" планирую определять тип продукта.
Как видите - используется разделитель - ";", как бы с его помощью разбить строку на переменные?
Спасибо!
DruOleg,
Можно для начала так :
!include "WordFunc.nsh"
OutFile Provider.exe
Section
${WordFind} "Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;" ";" "+1" $R0
MessageBox MB_OK "$R0"
SectionEnd
В $R0 будет "Provider=SQLOLEDB"
Потом отсекаем "Provider="
kotkovets
09-04-2012, 22:38
DruOleg, MKN, так будет работать, если подстрока Provider= - в начале строки,
иначе нужен цикл, к примеру в переменную $2 получаем строку из реестра:
StrCpy $2 "Provider=LCPI.IBProvider;Data Source=localhost:C:\Program Files\user\DB"
${WordFind} "$2" ";" "+1" "$3" ;получаем подстроку до первого символа ' ; '
Strlen $1 "Provider=" ;вычисляем длину отсекаемой части
StrCpy $2 "$3" "" $1 ;отсекаем
MessageBox MB_OK "$2" IDOK
Дайте мне хоть слово сказать :clapping:
А можно и воть так:
!include "StrFunc.nsh"
!include "FileFunc.nsh"
${StrStrAdv}
Function TEST
StrCpy $0 "Provider=SQLOLEDB;Data Source=W2K3SP2\SQLEXPRESS;Initial Catalog=user_db;Persist Security Info=True;User ID=user;Password=user;"
; В переменную $0 помещаем всю строку
StrCpy $1 "Password="
; В переменную $1 помещаем ключ, значение которого будем определять
${GetOptions} "$0" "$1" $2
${StrStrAdv} $2 "$2" ";" ">" "<" "0" "0" "1"
MessageBox MB_OK "$2"
; В переменной $2 результат
FunctionEnd
3 переменных для наглядности, так-то если жалко :lol: можно везде $2 заменить на $1 и результат в однёрочке будет
Вроде работает :yes:
не работает из-за ${GetOptions}... »
Поправил пост, там инклуд ещё один, простииите :cry:
K.A.V.,
Расскажи подробнее про ${StrStrAdv}. Когда, как и зачем... :)
ps Хорошо бы в справочнике рассказать про ВСЕ "штучки" ${} используемые в различных Function Header и логических конструкциях. С примерами...
K.A.V.,
Расскажи подробнее про ${StrStrAdv}. Когда, как и зачем... »
Не поверишь, но я сам не знаю по какому принципу работает эта команда :biggrin:
Я с ней не работал и не разбирал её, первый раз я с ней столкнулся в этой теме, когда у одного из участника возник похожий вопрос "Как получить значения в строке" (в справочнике это страничка Примеры кодов => Работа со строками => Фильтр символа "|": Разбивка значений)
Вот тогда я методом "тыка" получил результат
В StrFunc.nsi есть пример работы этой команды, я в ней не разбирался, но там какие-то сложные логические действия :)
На данный момент в работе со строками у меня проблем не возникает, и, собственно, в чем-то разбираться пока нет необходимости :drug:
Вот здесь возникла проблема у человека, мы её решили и я успокоился :tongue:
Оказывается есть описание StrStrAdv : http://nsis.sourceforge.net/StrStrAdv
как и некоторые, перечисленные в StrFunc.nsi
Подставляем в http://nsis.sourceforge.net/нужное и ищем...
А я искал в доке... Получается в доке, тоже далеко не всё есть...
kotkovets
10-04-2012, 11:01
рассказать про ВСЕ "штучки" ${} »
это простое объявление константы препроцессором NSIS,
причем константу, можно заключать макросы и функции, что очень удобно.
!define msgbox "!insertmacro _msgbox"
!macro _msgbox text
MessageBox MB_OK "${text}" IDOK
!macroend
Section
${msgbox} MKN
SectionEnd
Причем константа ${text} (значение константы) объявляется в пределах макроса (при вызове) _msgbox,
затем разрушается, что очень удобно, в отличии от глобальной константы ${msgbox}, где значение
этой константы можем поменять - только в функции иницилизации установщика (.OnInit)
kotkovets,
Я не совсем это (простое объявление констант) имел ввиду. А разбор конкретных ( ${StrCase} ${StrClb} ${StrIOToNSIS} ${StrLoc} ${StrNSISToIO} ${StrRep} ${StrStr} ${StrStrAdv} ${StrTok} ${StrTrimNewLines} ${StrSort} и т.д. и для разных хедеров (не только для StrFunc) ) с примерами и комментами... Хотя бы тех, что не вошли пока в справочник.
Например, сделать пример работы, скажем наугад, - ${StrCase} так :
Сначала указываем Syntax : ${StrCase} "ResultVar" "String" "Case"
Потом код примера :
!include "StrFunc.nsh"
${StrCase}
Name "StrCase"
OutFile "StrCase.exe"
Section
MessageBox MB_OK " Преобразуем строку\
$\r$\n Папа у Васи работает в ФСБ\
$\r$\n используя различные ключи"
${StrCase} $0 "Папа у Васи работает в ФСБ" "L"
MessageBox MB_OK "Когда используем ключ L, то строка преобразуется так :\
$\r$\n $0"
${StrCase} $0 "Папа у Васи работает в ФСБ" "U"
MessageBox MB_OK "Когда используем ключ U, то строка преобразуется так :\
$\r$\n $0"
${StrCase} $0 "Папа у Васи работает в ФСБ" "T"
MessageBox MB_OK "Когда используем ключ T, то строка преобразуется так :\
$\r$\n $0"
${StrCase} $0 "Папа у Васи работает в ФСБ" "S"
MessageBox MB_OK "Когда используем ключ S, то строка преобразуется так :\
$\r$\n $0"
${StrCase} $0 "Папа у Васи работает в ФСБ" "<>"
MessageBox MB_OK "Когда используем ключ <>, то строка преобразуется так : \
$\r$\n $0"
SectionEnd
Пользователь просто скомпилит код - и сразу наглядно понятно для чего нужен и что делает ${StrCase}
И так для всего прочего. Хлопотно конечно и справочник разбухнет, но оно того стОит.
Для примеров оформления страниц и для примеров всевозможных вариаций переключения кнопок-чекбоксов , самое лучшее это GIF-анимашки.
Ежели сделаешь в коде так, то смотри как это будет выглядеть и главное, как работать, а если так то смотри далее...
И если уж после таких примеров будут вопросы.... :)
kotkovets
10-04-2012, 15:08
MKN, открывай публикацию своих тестов и "новых неизвестных народу макросов" :)
а мы добавим в справочник.
И если уж после таких примеров будут вопросы.... »
будут, не заржавеет...
MKN, открывай публикацию своих тестов и "новых неизвестных народу макросов" »
MKN, зря пример выложил :lol:
а мы добавим в справочник. »
Ну а если говорить серьёзно, то лично я английского не знаю и сложно изучать техническую документацию, тем более когда речь идёт о программировании, думаю все знают, как программы-переводчики справляются с переводом таких текстов :biggrin:
На это опять же, нужно убить колосальное количество времени, сюда я не отношу такие простые команды как ${GetOptions} например, это всё просто (или взять те же команды, которые я уже перевёл из справки, там всё легко), говорю о сложных манипуляциях со строками как например эта же команда ${StrStrAdv}, на страничке документации по ней информации не мало и, нужно сесть, и хорошенько напрячь извилины :)
Почему я не берусь за эти команды я уже сказал, нет надобности, тем более, что сложными операциями со строками сталкиваются еденицы
${StrStrAdv}, на страничке документации по ней информации не мало и, нужно сесть, и хорошенько напрячь извилины »
Вот ещё пример использования ${StrStrAdv} , для тех кто не хочет напрягаться (я и сам такой :) ) :
Синтаксис : ${StrStrAdv} "ResultVar" "String" "SubString" "SearchDirection" "StrInclusionDirection" "IncludeSubString" "Loops" "CaseSensitive"
!include "StrFunc.nsh"
${StrStrAdv}
OutFile "StrStrAdv.exe"
Section
MessageBox MB_OK " Преобразуем строку:\
$\r$\n Раз пошли на дело я и Рабинович. Рабинович выпить захотел. Эх, Рабинович !\
$\r$\n используя различные ключи"
StrCpy $0 "Раз пошли на дело я и Рабинович. Рабинович выпить захотел. Эх, Рабинович !"
MessageBox MB_OK 'Например, оставим всё, что находится СЛЕВА от слова "Рабинович". Искать будем с НАЧАЛА строки\
$\r$\n Для этого устанавливаем :\
$\r$\n SubString: "Рабинович"\
$\r$\n SearchDirection: ">"\
$\r$\n StrInclusionDirection: "<"'
${StrStrAdv} $1 "$0" "Рабинович" ">" "<" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной :\
$\r$\n $1"
MessageBox MB_OK 'Ищем "Рабинович" 2 раза с НАЧАЛА. (Т.е. пропускаем, оставляем 2х Рабиновичей)\
$\r$\n "Loops" установим "2"'
${StrStrAdv} $2 "$0" "Рабинович" ">" "<" "0" "2" "0"
MessageBox MB_OK "Получаем в переменной :\
$\r$\n $2"
MessageBox MB_OK 'Снова, оставим всё, что находится СЛЕВА от слова "Рабинович". Но искать будем с КОНЦА строки\
$\r$\n Для этого устанавливаем :\
$\r$\n SubString: "Рабинович"\
$\r$\n SearchDirection: "<" (сменили направление поиска)\
$\r$\n StrInclusionDirection: "<"'
${StrStrAdv} $3 "$0" "Рабинович" "<" "<" "0" "0" "0"
MessageBox MB_OK "Получаем в переменной :\
$\r$\n $3"
MessageBox MB_OK 'Ищем "Рабинович" с КОНЦА 2 раза. Т.е. "Loops" установим "2"'
${StrStrAdv} $4 "$0" "Рабинович" "<" "<" "0" "2" "0"
MessageBox MB_OK "Получаем в переменной :\
$\r$\n $4"
SectionEnd
От значения IncludeSubString - 0 или 1 , зависит, будет ли SubString (это то, указанное в строке слово(сочетание), "от которго пляшем" - слева или справа от которого оставляем нужное нам) добавлено к результирующему значению.
******************
(По этому же принципу работает и ${StrStr}, только с ограничением - оставляется только то, что находится справа от SubString плюс сам SubString . ${StrStr} "ResultVar" "String" "SubString")
${StrStrAdv} - это ${StrStr} Advanced
******************
Значение "CaseSensitive" - 0 или 1 - учитывать регистр или нет.
Если подстрока не найдена, то в переменную будет возвращена пустая строка .
Если подстрока пустая, то строка будет возвращена с флагом ошибки.
Если строка пустая, то будет возвращена пустая строка с флагом ошибки.
wolkow70
10-04-2012, 17:59
Товарищи, как прописать в скрипте команду на запись параметра: ?
Opera.HTML тип параметра REG_NONE
Экспорт в рег-файл дает:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.htm\OpenWithProgIDs]
"Opera.HTML"=hex(0):
Первый раз с таким сталкиваюсь....
wolkow70,
Это умеет Registry plug-in http://nsis.sourceforge.net/Registry_plug-in
wolkow70
10-04-2012, 18:20
Так правильно будет?
${registry::Write} "HKLM "SOFTWARE\Classes\.htm\OpenWithProgIDs" "Opera.HTML" "" "REG_NONE"
wolkow70,
где то так :
!include "Registry.nsh"
Section
${registry::Write} "HKLM\SOFTWARE\Classes\.htm\OpenWithProgIDs" "Opera.HTML" "" "REG_NONE" $R0
SectionEnd
wolkow70
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Описания плагинов => Registry: Работа с реестром
wolkow70
10-04-2012, 18:33
${registry::Write} "HKLM "SOFTWARE\Classes\.htm\OpenWithProgIDs" "Opera.HTML" "" "REG_NONE" $R0
!insertmacro: macro "registry::Write" requires 5 parameter(s), passed 6!
wolkow70, смысл того, что вы здесь спрашиваете, вы ответ от MKN выше прочитали вообще??
${registry::Write} "HKLM\SOFTWARE\Classes\.htm\OpenWithProgIDs" »
а у вас...
${registry::Write} "HKLM "SOFTWARE\Classes\.htm\OpenWithProgIDs" »
wolkow70
11-04-2012, 13:16
Товарищи, реально ли средствами NSIS в файле opera_install_log.xml все пути C:\Program Files\Opera поменять на путь прописанный в $INSTDIR или нет?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC