Показать полную графическую версию : [архив].: NSIS - все вопросы :.
как скрыто запустить батник, как в 7-zip sfx ?
kotkovets
29-10-2011, 15:27
vahe-91, Попробуй стандартный плагин
nsExec::Exec "file.cmd"
Pop $0
На офф.сайте есть плагин:
http://nsis.sourceforge.net/ExecCmd_plug-in
Пример создания SFX архива
ExecCmd::Exec 'COPY /b "Путь\7ZSD_LZMA2.sfx" + "Путь\config.txt" + "Путь\Archive.7z" "Путь\app.exe"'
В справочнике по NSIS->Работа с процессами с помощью NSIS (Запуск внешних приложений в режиме ожидания завершения приложения)
nsExec::Exec "file.cmd" »
спасибо, это то что нужно :) но зачем нужен Pop $0 ?
kotkovets
29-10-2011, 16:48
спасибо, это то что нужно но зачем нужен »
В стек возвращается код возврата запускаемой проги, и следует, что мы можем с
уверенностью сказать, как отработала прога.
Pop $0
MessageBox MB_OK "$0"
Сделай успешное выполнение команды, а затем заведомо не успешное. Сравни циферки...
У меня так конструктор на руборде организован на кодах возврата - и я узнаю сразу в чем проблема
kotkovets, еще хотел спросить, из-за чего может создание деинсталятора задержатся примерно на пол минуты ?
kotkovets
29-10-2011, 21:34
из-за чего может создание деинсталятора задержатся примерно на пол минуты ? »
Трудно судить почему, из-за вопроса только, может какие процессы до создания идут, скрипт в студию, а там видно будет...
Трудно судить почему, из-за вопроса только, может какие процессы до создания идут, скрипт в студию, а там видно будет... »
Скрипт не могу показать. В скрипте деинсталятора примерно две тысячи строк, для удаления ключей из реестра, это может быть причиной ?
kotkovets
29-10-2011, 22:03
vahe-91, закомментируй команды последовательно, пока не исчезнет "эффект"
удаление плагом аль стандартными командами? циклы есть?
удаление плагом аль стандартными командами? циклы есть? »
плагинов нет, есть goto
setregview 32
deleteregkey hklm "ключь"
setregview 64
deleteregkey hklm "ключь"
примерно тисяча строк под setregview 32 и одно и тоже под setregview 64. В секции деинсталятора только это и несколько rmdir и unregdll.
kotkovets
29-10-2011, 22:21
Ясно, если стока строк - то только оптимизация кода немного может.
Деинсталлятор то компилится на "горячую руку"...поэтому такая задержка.
есть goto »
:) Вообще не использую безусловные переходы в чистом ввиде, лишь только для выхода
из глубоких логических конструкций и циклов! посему советую использовать логические конструкции
(обертки переходов на уровне компилятора) работает быстрее, ведь код сразу компилится,
а при goto установщик прыгает в процессе установки!т.е установщик еще не знает, что ему подсунут :)
kotkovets, спасибо, попробую избавится от goto :)
kotkovets
29-10-2011, 22:45
Попробуй, но не гарантирую, что будет "существенно" быстрее, трудно судить не видя проблемного кода,
если все таки есть цикл - это и есть тормоз, ведь ему надо "двигать" прогресс - это существенно замедляет работу в целом
Здесь только поможет макрос писать с использованием хидера Util.nsh - который основан на функции и перехода
по абсолютной метке - это сильно ускоряет работу цикла. Если надо могу показать такой пример цикла.
kotkovets спасибо за советы,если сам не справлюсь, отправлю скрипт по ПМ, если у вас будет время, посмотрите ? :)
kotkovets
29-10-2011, 23:10
да ради бога, сейчас не буду смотреть - позже.
макрос FileAssociation.nsh скачанный отсюда http://nsis.sourceforge.net/File_Association пишет в HKCR, а мне нужно в HKLM \SOFTWARE\Classes. Если я в FileAssociation.nsh изменю все HKCR в HKLM "SOFTWARE\Classes", то будет все корректно работать ? если уже есть исправленная версия дайте ссылку пожалуйста.
kotkovets
31-10-2011, 03:58
макрос FileAssociation.nsh скачанный отсюда http://nsis.sourceforge.net/File_Association пишет в HKCR, »
Особой такой разницы нету, HKCR или HKLM - все равно записи продублируются.
Ну коль зачесалось, то меняй HKCR или HKLM
расставь для отладки в макросе сообщения для наглядного просмотра и правки макроса, если нужно:
MessageBox MB_OK "$$R0 = $R0$\n$$R1 = $R1"
$R0 или $R1 могут(не проверял) - SOFTWARE\Classes или какой ты там ключ укажешь в аргументах макроса,
нетрудно сопоставить с нужными тебе ветками реестра. Еще имеет смысл $R0 - в кавычки одеть.
WriteRegStr HKCR "$R1" "" "$R0"
и так далее.
CyberMaster
31-10-2011, 04:52
Чет не врубаюсь, почему InstallDirRegKey не хочет брать путь из реестра? 100500 раз проверял путь в реестре - все правильно и запись существует. Если закомментировать InstallDir "$PROGRAMFILES\Directory", тогда поле "Папка установки" в ингаляторе вообще пустое.
!define PRODUCT_NAME "TeamSpeak 3 Client"
!define PRODUCT_VERSION "3.0.1"
!define pkgdir "C:\TeamSpeak\package"
;Name and file
Name "${PRODUCT_NAME}"
OutFile "TeamSpeak3-Client-win64-${PRODUCT_VERSION}.exe"
SetCompressor /FINAL ZLIB
;Default installation folder
InstallDir "$PROGRAMFILES\Directory"
;Get installation folder from registry if available
InstallDirRegKey HKLM "Software\TeamSpeak 3 Client" ""
RequestExecutionLevel user
;--------------------------------
;Interface Settings
!include "MUI.nsh"
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
;--------------------------------
Section
SectionEnd
kotkovets
31-10-2011, 08:37
Чет не врубаюсь, почему InstallDirRegKey не хочет брать путь из реестра? 100500 раз проверял путь в реестре - все правильно и запись существует »
Потому что, гладиолус :)
;Default installation folder
InstallDir "$PROGRAMFILES\Directory"
;Get installation folder from registry if available
InstallDirRegKey HKLM "SOFTWARE\NSIS" ""
При любом раскладе все работает!
А ваш InstallDirRegKey не соответсвует, тому что нужно, 100%
InstallDirRegKey HKLM "Software\TeamSpeak 3 Client" ""
100500 раз проверял »
Можно ключ по умолчанию проверить 100501 раз
ReadRegStr $0 HKLM "SOFTWARE\TeamSpeak 3 Client" ""
MessageBox MB_OK "$0"
CyberMaster
31-10-2011, 15:42
ReadRegStr $0 HKLM "SOFTWARE\TeamSpeak 3 Client" ""
MessageBox MB_OK "$0"
Так тоже выводит пустое сообщение, но вот экспортировал запись из своего реестра:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\TeamSpeak 3 Client]
@="P:\\Program Files\\TeamSpeak"
"InstallMode"="AllUsers"
"ConfigLocation"="1"
"Start Menu Folder"="TeamSpeak 3 Client"
Как видите запись существует и путь к ней правильный. В чем же тогда дело? Это может быть связано с ОС? У меня Windows 7 x64
kotkovets
31-10-2011, 16:21
У меня Windows 7 x64 »
С этого и надо бы начинать!
InstallDirRegKey - имеет доступ только к 32-разрядному виду реестра.
Поэтому нужно редирект делать в первой функции.
Для начало подключаем хедер к телу скрипта - !include x64.nsh
Function .OnInit
${If} ${RunningX64}
SetRegView 64 ;включаем 64-разрядный вид
ClearErrors
ReadRegStr "$INSTDIR" HKLM "SOFTWARE\TeamSpeak 3 Client" ""
${If} ${Errors}
${OrIf} "$INSTDIR" == ""
StrCpy "$INSTDIR" "$PROGRAMFILES\Directory"
${EndIf}
SetRegView 32 ;включаем 32-разрядный вид (для 32-битных приложений)
${EndIf}
FunctionEnd
Этот код почти аналог - InstallDirRegKey в х64
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC