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

DruOleg
09-04-2012, 17:28
Привет всем.
Не как не могу разобраться с разбором строк...
Из реестра считывается строка вида:
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=" планирую определять тип продукта.
Как видите - используется разделитель - ";", как бы с его помощью разбить строку на переменные?
Спасибо!

MKN
09-04-2012, 18:24
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

K.A.V.
09-04-2012, 22:58
Дайте мне хоть слово сказать :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:

MKN
10-04-2012, 08:51
K.A.V.,
Расскажи подробнее про ${StrStrAdv}. Когда, как и зачем... :)

ps Хорошо бы в справочнике рассказать про ВСЕ "штучки" ${} используемые в различных Function Header и логических конструкциях. С примерами...

K.A.V.
10-04-2012, 09:11
K.A.V.,
Расскажи подробнее про ${StrStrAdv}. Когда, как и зачем... »
Не поверишь, но я сам не знаю по какому принципу работает эта команда :biggrin:

Я с ней не работал и не разбирал её, первый раз я с ней столкнулся в этой теме, когда у одного из участника возник похожий вопрос "Как получить значения в строке" (в справочнике это страничка Примеры кодов => Работа со строками => Фильтр символа "|": Разбивка значений)

Вот тогда я методом "тыка" получил результат

В StrFunc.nsi есть пример работы этой команды, я в ней не разбирался, но там какие-то сложные логические действия :)

На данный момент в работе со строками у меня проблем не возникает, и, собственно, в чем-то разбираться пока нет необходимости :drug:

Вот здесь возникла проблема у человека, мы её решили и я успокоился :tongue:

MKN
10-04-2012, 10:16
Оказывается есть описание 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)

MKN
10-04-2012, 11:38
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, открывай публикацию своих тестов и "новых неизвестных народу макросов" :)
а мы добавим в справочник.
И если уж после таких примеров будут вопросы.... »
будут, не заржавеет...

K.A.V.
10-04-2012, 16:20
MKN, открывай публикацию своих тестов и "новых неизвестных народу макросов" »
MKN, зря пример выложил :lol:
а мы добавим в справочник. »

Ну а если говорить серьёзно, то лично я английского не знаю и сложно изучать техническую документацию, тем более когда речь идёт о программировании, думаю все знают, как программы-переводчики справляются с переводом таких текстов :biggrin:

На это опять же, нужно убить колосальное количество времени, сюда я не отношу такие простые команды как ${GetOptions} например, это всё просто (или взять те же команды, которые я уже перевёл из справки, там всё легко), говорю о сложных манипуляциях со строками как например эта же команда ${StrStrAdv}, на страничке документации по ней информации не мало и, нужно сесть, и хорошенько напрячь извилины :)

Почему я не берусь за эти команды я уже сказал, нет надобности, тем более, что сложными операциями со строками сталкиваются еденицы

MKN
10-04-2012, 17:10
${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):

Первый раз с таким сталкиваюсь....

MKN
10-04-2012, 18:06
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"

MKN
10-04-2012, 18:28
wolkow70,
где то так :
!include "Registry.nsh"

Section
${registry::Write} "HKLM\SOFTWARE\Classes\.htm\OpenWithProgIDs" "Opera.HTML" "" "REG_NONE" $R0
SectionEnd

K.A.V.
10-04-2012, 18:32
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!

K.A.V.
10-04-2012, 18:38
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