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

kotkovets
24-05-2011, 21:25
то есть у них вместо EndIf используется NotSilent: Но при этом у них макрос несколько иной.. »
разница в том, что в скрипте AIMP используются безусловные метки, я же использую логические конструкции, в чем разница в работе - да ни в чем!Но! когда сложный и объемный скрипт в метках легко потеряться и как вывод - ошибки в скриптах. С логическими конструкциями куда лучше читабельность скрипта, и проще правки в скрипте делать. Я писал и огромные скрипты на 7000 и более строк и если использовать безусловные метки - это полный бардак, с логикой проще - я вижу начало конструкции и конец конструкции...т.е логика И, И-ИЛИ, исключающие И и т.д.
Выполняются все комманды в секции "!${PRODUCT_NAME}" после ${EndIf} и до конца секции, в том числе: »
Это секция всегда выполняется, здесь пишутся только самые необходимые компоненты для нормальной работы программы.
А свою ошибку исправил:
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию? »
моя оказалась однако, извиняюсь...
Section "-Install"
;чтение из файла ответов путь установки и перезапись значения $INSTDIR
;Условие чтения и перезаписи:
; ТОЛЬКО НЕ В РЕЖИМЕ ГЕНЕРАТОРА И ТОЛЬКО В ТИХОМ РЕЖИМЕ И ПРИ НАЛИЧИИ ФАЙЛА ОТВЕТОВ
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "ISTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
${If} $GMODE = 0 ;выполнение всегда, только не в режиме генератора
;--------
/*
тут ваш код!, эта секция всегда должна выполняться
команды пишем до конца конструкции ${EndIf}
*/
;--------
${EndIf}
SectionEnd

wolkow70
25-05-2011, 10:23
kotkovets,
Ваша идея насчет логических конструкций показала себя состоятельной. Генератор ответов стал работать как часы.


Читал Справку, где вы приводите пример:

DeleteRegValue [root_key] [subkey] [key_name]

Удаляет параметр key_name из раздела subkey ветки root_key.
Флаг ошибки будет установлен в том случае, если раздел/параметр не найден, или удаление не возможно.
DeleteRegValue HKLM "Software\My Company\My Software" "some value"

Ломаю голову над проблемой удаления определенного значения:

Например, производится регистрация типа файла:

WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"

В удалении будет комманда:

DeleteRegValue HKCU "Software\Classes\.mp3" ""

Эта комманда удалит любое значение параметра. А если произошла переассоциация назначения файла? Тогда удаление параметра нарушит работу другой программы.

Вот думаю, как удалить определенное значение? Пробовал так:
DeleteRegValue HKCU "Software\Classes\.mp3" "" "jetAudio.ASSOC.Audio"
не получается компиляция скрипта.

То есть, если значение "jetAudio.ASSOC.Audio", то нужно удалить, иначе нет.

K.A.V.
25-05-2011, 10:39
То есть, если значение "jetAudio.ASSOC.Audio", то нужно удалить, иначе нет. »


ReadRegStr $0 HKCU "Software\Classes\.mp3" ""
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Classes\.mp3" ""

DruOleg
26-05-2011, 13:26
Привет всем. Прошу помочь в следующем.
Необходимо отредактировать стандартный конфигурационный файл php.ini:
i. Раскоментировать cgi.force_redirect и установить в 0: cgi.force_redirect = 0
ii. safe_mode = Off
iii. установить переменную memory_limit в разумное значение в зависимости от памяти на сервере, но чем больше, тем лучше.
iv. session.save_handler = files
v. magic_quotes_gpc = Off.
vi. magic_quotes_runtime = Off
vii. file_uploads = On
viii. session.auto_start = 0
ix. session.bug_compat_warn = Off
x. session.save_path = "/Sessions"
xi. extension_dir = "ext"
xii. date.timezone установить в таймзону того места где установлен сервер. Список поддерживаемых зон можно найти на http://www.php.net/manual/en/timezones.php
xiii. smtp=<smtp_domain>; smpt_port=<smtp_port> - установить адрес и порт smtp сервера для отсылки почты

Подскажите как это лучше сделать, желательно с примерами.

wolkow70
26-05-2011, 14:06
Почему-то не работает у меня в деинсталляторе такая конструкция:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" ""
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" ""

Вроде по справке делал...

При инсталляции вносится:
WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" "jetAudio.ASSOC.Audio"

K.A.V.
26-05-2011, 14:11
ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" "" »
"Progid" - лишнее


Привет всем. Прошу помочь в следующем.
Необходимо отредактировать стандартный конфигурационный файл php.ini: »

Команда на запись следующая (не забудьте заменить ПУТЬ К ФАЙЛУ):

WriteINISTr "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "ИМЯ ПАРАМЕТРА" "ЗНАЧЕНИЕ"

т.е. получится следующее:
i. Раскоментировать cgi.force_redirect и установить в 0: cgi.force_redirect = 0
Раскомментировать не будем, сразу установим значение

WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "cgi.force_redirect" "0"
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "safe_mode" "Off"

iii. установить переменную memory_limit в разумное значение в зависимости от памяти на сервере, но чем больше, тем лучше.
Сами думаю справитесь?


; iv. session.save_handler = files
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.save_handler" "files"

; v. magic_quotes_gpc = Off.
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "magic_quotes_gpc" "Off"

; vi. magic_quotes_runtime = Off
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "magic_quotes_runtime" "Off"

; vii. file_uploads = On
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "file_uploads" "On"

; viii. session.auto_start = 0
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.auto_start" "0"

; ix. session.bug_compat_warn = Off
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.bug_compat_warn" "Off"

; x. session.save_path = "/Sessions"
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "session.save_path" "/Sessions"

; xi. extension_dir = "ext"
WriteINISTR "ПУТЬ К ФАЙЛУ\php.ini" "PHP" "extension_dir" "ext"

xii. date.timezone установить в таймзону того места где установлен сервер. Список поддерживаемых зон можно найти на http://www.php.net/manual/en/timezones.php
xiii. smtp=<smtp_domain>; smpt_port=<smtp_port> - установить адрес и порт smtp сервера для отсылки почты
Справитесь?

wolkow70
26-05-2011, 14:28
K.A.V.,


ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" ""

Компилятор показывает ошибку в строке..

K.A.V.
26-05-2011, 14:30
ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" "Progid" ""
Компилятор показывает ошибку в строке.. »
Ну естественно, я же говорю "Progid", у вас за этой записью стоят кавычки удалите "Progid"

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.MP3\UserChoice" ""

MKN
26-05-2011, 16:45
Подскажите пожалуйста, как решить такую задачу :

Имеется текстовый файл с кучей строк, одна из которых начинается с :

ProductCode {здесь может быть разное количество цифр}

Необходимо извлечь из этой строки этого текстового файла только : {здесь может быть разное количество цифр}

Извлечь либо в переменную, если это использовать в скрипте, либо в отдельный текстовый файлик.

Также интересен момент - возможно ли записать в переменную имя файла, находящегося рядом со скриптом (либо нет) и имеющего маску *.msi (либо какую другую) ?

kotkovets
26-05-2011, 17:14
MKN
Я так понял тебе нужно циферки получить на момент компиляции скрипта? тогда нужно писать батник - запускать препроцессором NSIS и заинклюдить циферки в скрипт смотри
http://forum.oszone.net/post-1657610-1065.html
вопрос в содержимом батника, т.е как работать в командной строке с текстовыми строками...к спецам по командной строке нужно обратиться
Также интересен момент - возможно ли записать в переменную имя файла, находящегося рядом со скриптом (либо нет) и имеющего маску *.msi (либо какую другую) ? »
аналогично.

MKN
26-05-2011, 17:39
kotkovets,
А если упростить задачу - просто "получить циферки" из имеющегося текстового файла и записать их в другой текстовый файл ?

K.A.V.
26-05-2011, 18:01
Имеется текстовый файл с кучей строк, одна из которых начинается с :
ProductCode {здесь может быть разное количество цифр}
Необходимо извлечь из этой строки этого текстового файла только : {здесь может быть разное количество цифр}
Извлечь либо в переменную, если это использовать в скрипте, либо в отдельный текстовый файлик. »
В начале кода

!include "TextFunc.nsh"
!define ${LineFind}


Далее вызываем функцию поиска
${LineFind} "$DESKTOP\TEST.txt" "/NUL" "1:-1" "LineFindFunction"
; После функции поиска идёт запись значения в файл
FileOpen $0 "$DESKTOP\kav_temp.txt" w
FileWrite $0 "$R1"
FileClose $0

где $DESKTOP\TEST.txt - файл в котором ищем
где $DESKTOP\kav_temp.txt - файл в который записываем циферки


Сама функция поиска в файле

Function "LineFindFunction"
StrCpy $R0 "$R9" 11
StrCmp $R0 "ProductCode" 0 nofind
StrCpy $R1 "$R9" "" 12
Push "StopLineFind"
nofind:
Push $0
FunctionEnd


Циферки будут в переменной $R1

kotkovets
26-05-2011, 18:03
MKN, я могу помочь на этапе инсталляции, т.е все действия обязательно проводим перед проверкой на предмет установленного продукта msi и наличие текстового файлика - будем брать цифры оттуда, в случае не нахождения тектового файлика - установить msi
OutFile "TextProduct.exe"
!include "TextFunc.nsh"
!include "Logiclib.nsh"
!include "StrFunc.nsh"
${StrRep}
Var ProductCode
ShowInstDetails show

Section MSIProduct
${FileReadFromEnd} "$EXEDIR\text.txt" "FileRead"
${IfNot} ${Errors}
${AndIfNot} $ProductCode == ``
;Здесь команды проверки на предмет установки и команда установки
;MessageBox MB_ICONINFORMATION|MB_OK "$ProductCode" IDOK
${Else}
;Здесь команда установки если нет файла
${EndIf}
SectionEnd

Function FileRead
StrLen $R0 "ProductCode"
StrCpy $R1 $9 $R0
${If} $R1 == "ProductCode"
${StrRep} $9 $9 $\r$\n ""
${StrRep} $ProductCode $9 "ProductCode " ""
StrCpy $0 StopFileReadFromEnd
${EndIf}
Push $0
FunctionEnd
Формат искомой строки: ProductCodeпробел!{здесь может быть разное количество цифр}
Прикольно получилось, пока писал ответили...

wolkow70
26-05-2011, 19:03
K.A.V.,

При таком раскладе:

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" ""
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" ""
"Progid" никак не хочет удаляться...

http://s58.radikal.ru/i159/1105/ed/695c48466cc4.png

K.A.V.
26-05-2011, 19:21
"Progid" никак не хочет удаляться... »
Я думал, вам нужно обработать параметр "По умолчанию", тогда в таком случае Progid указываем :)

ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" "Progid"
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.AC3\UserChoice" "Progid"

DruOleg
27-05-2011, 10:10
Подскажите пожалуйста, как выполнить следующие действия.
Необходимо считать данные который пользователь введет при установке ПО, и вставить эти данные в 2 конфигурационных файла.
Из справочника взял следующий код:


!include "MUI.nsh"
!include "nsDialogs.nsh"
SetCompress off

!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

Name "Winreview.ru"
OutFile "winreview.exe"
ShowInstDetails show

Var Dialog
Var Label
Var Text
Var CheckBox

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateLabel} 0 5u 100u 10u "Это надпись"
Pop $Label

${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text
${NSD_OnChange} $Text fnTextChange

${NSD_CreateCheckBox} 0 45u 100u 10u "Можно отметить флажком"
Pop $CheckBox

nsDialogs::Show
FunctionEnd

Function fnTextChange
Pop $1
${NSD_GetText} $Text $R0
${NSD_SetText} $Label "Текст в поле ввода: $R0"
FunctionEnd

Function fnCustomDestroy
${NSD_GetText} $Label $R0
StrCpy $R1 "Текст надписи:$R0$\n"
${NSD_GetText} $Text $R0
StrCpy $R1 "$R1Текст в поле ввода:$R0$\n"
${NSD_GetState} $CheckBox $R0
StrCpy $R1 "$R1Состояние флажка:$R0$\n"
MessageBox MB_OK $R1
FunctionEnd

Section
DetailPrint "Hello from winreview.ru"
SetAutoClose false
SectionEnd


Не как не могу понять как взять полученные данные и воспользоваться ими. Например отобразить из тут - DetailPrint "Hello from winreview.ru" .
Прошу помощи.

kotkovets
27-05-2011, 10:59
Например отобразить из тут » :) :search:
Function fnCustomDestroy
${NSD_GetText} $Label $R0 ;текст надписи в переменной $R0
${NSD_GetText} $Text $R1 ;текст поля ввода в переменной $R1
${NSD_GetState} $CheckBox $R2 ;состояние чебокса в переменной $R2 : 0 - не отмечен, 1 - отмечен
FunctionEnd

Section
DetailPrint "Label : $R0"
DetailPrint "Text : $R1"
DetailPrint "CheckBox : $R2"
SectionEnd

Посмотрите примеры кастомных страниц на предыдущих страничках темы - я много примеров приводил.
Почитайте про переменные и как пользоваться.

DruOleg
27-05-2011, 16:58
Снова я:)
Необходимо отредактировать файл config.php.
А именно установить значения:

$CFG->dbtype = 'mssql_n';
$CFG->dblibrary = 'native';
$CFG->dbhost = 'Server';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'Admin';
$CFG->dbpass = 'somepass';
$CFG->prefix = 'mdl_';


Прошу помочь.

kotkovets
27-05-2011, 18:14
А именно установить значения:
Код:
$CFG->dbtype = 'mssql_n';
$CFG->dblibrary = 'native';
$CFG->dbhost = 'Server';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'Admin';
$CFG->dbpass = 'somepass';
$CFG->prefix = 'mdl_'; »
Можно сделать так,
!include "MUI2.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile Test.exe
Caption "Replace text"

Section
${LineFind} "$EXEDIR\config.php" "" "1:-1" "Replace"
IfErrors 0 +2
MessageBox MB_ICONSTOP|MB_OK "Файл не найден!"
SectionEnd

Function Replace
StrLen $R0 "$$CFG->dbtype = 'pgsql'" ;вычисляем длину искомой строки
StrCpy "$R1" "$R9" "$R0" ;обрезаем строку на искомую длину
${If} "$R1" == "$$CFG->dbtype = 'pgsql'" ;сравниваем строку со строкой в файле
${WordReplace} '$R9' "'pgsql'" "'nsis'" "+" '$R9' ;заменяем 'pgsql' на 'nsis'
${EndIf}
;-----------------


;-----------------
Push $0
FunctionEnd
И далее другие значения заменяем по такой схеме, хотя можно и проще сделать, но что то не думается :beta:

wolkow70
28-05-2011, 14:03
kotkovets


Почитал справку, и нашел немного не то, что мне нужно:
Рассматривается пример:

Section /o "Компонент №1" ID_1
SectionEnd

Section "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

Section /o "Компонент №4" ID_4
SectionEnd

Section "Компонент №5" ID_5
SectionEnd

Section /o "Компонент №6" ID_6
SectionEnd

Функция проверки отметки, обязательна
Function .onSelChange

; Выбор между компонентам 1, 2, 3
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro EndRadioButtons

; Выбор между компонентам 5 и 6
!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${ID_5}
!insertmacro RadioButton ${ID_6}
!insertmacro EndRadioButtons

FunctionEnd

Назначаем по-умолчанию отмеченные
Function .onInit

StrCpy $1 ${ID_2}
StrCpy $2 ${ID_5}

У меня так:
В инсталлятор встроена секция деинсталляции программы для удобной переустановки.
http://s002.radikal.ru/i198/1105/a5/92496cbcd09b.png
То есть, если ставится галка на секцию 1, то все остальные автоматически отключаются и идет только удаление программы.
И наоборот, если нажать на любую другую, то отключается 1.
Не пойму как это реализовать....




© OSzone.net 2001-2012