Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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", то нужно удалить, иначе нет.
То есть, если значение "jetAudio.ASSOC.Audio", то нужно удалить, иначе нет. »
ReadRegStr $0 HKCU "Software\Classes\.mp3" ""
StrCmp $0 "jetAudio.ASSOC.Audio" 0 +2
DeleteRegValue HKCU "Software\Classes\.mp3" ""
Привет всем. Прошу помочь в следующем.
Необходимо отредактировать стандартный конфигурационный файл 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"
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" ""
Компилятор показывает ошибку в строке..
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" ""
Подскажите пожалуйста, как решить такую задачу :
Имеется текстовый файл с кучей строк, одна из которых начинается с :
ProductCode {здесь может быть разное количество цифр}
Необходимо извлечь из этой строки этого текстового файла только : {здесь может быть разное количество цифр}
Извлечь либо в переменную, если это использовать в скрипте, либо в отдельный текстовый файлик.
Также интересен момент - возможно ли записать в переменную имя файла, находящегося рядом со скриптом (либо нет) и имеющего маску *.msi (либо какую другую) ?
kotkovets
26-05-2011, 17:14
MKN
Я так понял тебе нужно циферки получить на момент компиляции скрипта? тогда нужно писать батник - запускать препроцессором NSIS и заинклюдить циферки в скрипт смотри
http://forum.oszone.net/post-1657610-1065.html
вопрос в содержимом батника, т.е как работать в командной строке с текстовыми строками...к спецам по командной строке нужно обратиться
Также интересен момент - возможно ли записать в переменную имя файла, находящегося рядом со скриптом (либо нет) и имеющего маску *.msi (либо какую другую) ? »
аналогично.
kotkovets,
А если упростить задачу - просто "получить циферки" из имеющегося текстового файла и записать их в другой текстовый файл ?
Имеется текстовый файл с кучей строк, одна из которых начинается с :
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
"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"
Подскажите пожалуйста, как выполнить следующие действия.
Необходимо считать данные который пользователь введет при установке ПО, и вставить эти данные в 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
Посмотрите примеры кастомных страниц на предыдущих страничках темы - я много примеров приводил.
Почитайте про переменные и как пользоваться.
Снова я:)
Необходимо отредактировать файл 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC