Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
какими привилегиями обладает аккаунт (как UserInfo) пользователя? »
Посмотри здесь http://nsis.sourceforge.net/Enumerate_User_Privileges
или используй команду SHOW GRANTS (Просмотр привилегий http://www.dbaguru.ru/users-privileges.html )
Kopejkin
27-05-2015, 18:36
Сколько процессов можно убить за один сеанс?
Например, в таком виде отлично убиваются все разноименные (у меня - 6) процессы и несколько одноименных (в моем случае одноименных процессов - 7). Но за один сеанс убиваются только 4 одноименных. Остальные остаются.
Одноименные процессы могут создавать как разные однотипные программы, так и одна программа (множественный запуск).
Можно ли их убить все за раз?
Function .OnInit
${KillProcess} "proc1.exe" $0
${KillProcess} "proc2.exe" $0
${KillProcess} "proc3.exe" $0
${KillProcess} "proc4.exe" $0
${KillProcess} "proc5.exe" $0
${KillProcess} "proc6.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
${KillProcess} "run.exe" $0
Также интересует, как определить текущие региональные настройки. В частности - формат и расположение?
Также интересует, как определить текущие региональные настройки. В частности - формат и расположение? »
Необходимые данные можно узнать в разделе реестра [HKEY_CURRENT_USER\Control Panel\International]. Считываешь значения желаемых параметров и, в зависимости от полученных результатов, выполняешь необходимые действия.
Сколько процессов можно убить за один сеанс? »
Смотря как напишите код, в таком виде как у вас - не больше 7 одноименных процессов, если же сделать циклом, то будут завершены все процессы с указанным образом
!include "Logiclib.nsh"
${While} ${ProcessExists} "notepad.exe"
${KillProcess} "notepad.exe" $0
${If} $0 == "1"
Detailprint "процесс завершен"
${ElseIf} $0 == "2"
Detailprint "процесс не завершен"
${ElseIf} $0 == "none"
Detailprint "процесс не найден"
${ElseIf} $0 == "error"
Detailprint "ошибка получения снимка запущенных процессов"
${EndIf}
${EndWhile}
Либо использовать
taskkill /f /im "notepad.exe"
эта команда за одно выполнение завершает все процессы с указанным образом
Kopejkin
30-05-2015, 15:41
эта команда... »
Сорри, а как её использовать в сценарии?
Спрашиваю для общего развития, т.к. выше описанный вами сценарий успешно справляется с задачей. Спасибо еще раз.
Сорри, а как её использовать в сценарии? »
exec 'taskkill /f /im "notepad.exe"'
taskkill - из состава операционной системы, живёт в System32 папке...
ya_dukenukem
02-06-2015, 14:38
Добрый
Подскажите чайнику: можно ли изменить размер главного окна инсталлятора? т.е. отличный от 300*140
Заранее спасибо
можно ли изменить размер главного окна инсталлятора? »
в папке <NSIS>\Contrib\UIs лежат EXE файлы с ресурсами диалогов, ковыряйте редактором ресурсов (ResHacker, Restorator) и изменяйте что хотите
Подскажите чайнику »
Раз такое дело, то сразу предложу прочитать Справочник по NSIS (http://forum.oszone.net/thread-168287.html)
Kopejkin
02-06-2015, 21:15
Подскажите, если так выглядит запись для обычного ярлыка,
CreateShortCut "$SMPROGRAMS\Software\Maker\Сайт Maker.lnk" "http://www.maker.com" "" "$INSTDIR\maker.exe" "" "" "" "Посетить веб-сайт програмы Maker"
то как записать Ярлык Интернета (.url)
(и чтобы с пиктограммкой дефолтного браузера)?
то как записать Ярлык Интернета (.url) »
Ну url файл это вообще "не ярлык" сам по себе (если можно так выразиться), это файл формата INI, соответственно и создавать нужно либо командами WriteINIStr в файл с расширением url, либо просто распаковывать заранее подготовленный файл
Содержание файла такое:
[InternetShortcut]
URL=http://vk.com/sfxcreator
IconFile=путь к файлу иконки
IconIndex=индекс иконки (если exe/dll файл)
соответственно, записываем нужные данные и url файл готов, можно создать его сразу на рабочем столе (например), либо создать в папке с программой и уже к этому файлу создавать ярлык на рабочем столе
и чтобы с пиктограммкой дефолтного браузера »
Определить нужно сначала дефолтный браузер :)
Не особо вникал в этот вопрос (правильное ли это определение или нет):
ReadRegStr $1 HKCR "http\DefaultIcon" ""
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "URL" "http://vk.com/sfxcreator"
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "IconFile" "$1"
проверку на отсутствие записи и запись другого значка, сами уже сделаете, как нужно
На примере Firefox - там иконка html-файла (значение параметра путь к firefox.exe и с индексом 1, firefox.exe,1)
Забегая вперёд и включая вангу, предположу возникновение вопроса о том, как отсечь с конца строки символ запятой вместе с индексом иконки :)
!include "Logiclib.nsh"
!include "StrFunc.nsh"
${StrLoc}
ReadRegStr $1 HKCR "http\DefaultIcon" ""
${StrLoc} $0 "$1" "," "<" ; получаем в $0 количество символов после знака запятой
${If} $0 != "" ; если $0 = '' (пустое значение), значит символа запятой нет, соответственно, отсекать символы не нужно
IntOp $0 $0 + 1 ; к количеству символов после запятой прибавляем 1, получаем общее количество символов (индекс+символ запятой) которое мы будем отрезать с конца строки
StrCpy $1 $1 -$0 ; отрезаем $0 символов с конца строки
${EndIf}
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "URL" "http://vk.com/sfxcreator"
WriteINIStr "$DESKTOP\TEST.url" "InternetShortcut" "IconFile" "$1"
Kopejkin
03-06-2015, 09:26
...Не особо вникал »
Оказывается, не так все и просто. А я думал, что это я вникал... :lamer:
Спасибо еще раз.
Возник вопрос по удалению папки установленной программы.
Например, файлы устанавливаются в C:\Program Files (x86)\Aleo Software\Flash Intro and Banner Maker\ = $INSTDIR, по умолчанию.
Для того, чтобы удалить папку [Aleo Software], приходится устанавливать (как написано в Руководстве) текущий рабочий каталог, являющийся родителем папки [Aleo Software], т.е. C:\Program Files (x86):
SetOutPath "$PROGRAMFILES"
RMDir /r "$PROGRAMFILES\Aleo Software"
А если я не знаю, куда пользователь захочет установить программу? Нужно будет извлекать пользовательский путь, отсекать каталог установки, оставляя путь к "родительской" папке и назначать как SetOutPath. Или я опять чего-то не учитываю (несу чушь)?
Для того, чтобы удалить папку [Aleo Software], приходится устанавливать (как написано в Руководстве) текущий рабочий каталог, являющийся родителем папки [Aleo Software] »
Не сказано там такого :) Там говорится, что вы не сможете удалить папку, которая установлена сейчас "текущим каталогом"
Так, например, удаление не сработает:
SetOutPath $TEMP\dir
RMDir $TEMP\dir
Хотя если указать ключ /r то содержимое папки $TEMP\dir всё-равно будет очищено полностью
Т.е. перед удалением какой-либо папки можете установить текущим каталогом левую папку, например временную папку $TEMP
Нужно будет извлекать пользовательский путь, отсекать каталог установки, оставляя путь к "родительской" папке и »
и удалять родительскую папку? Забавный инсталлер получится, если я установлю вашу программу в папку на рабочем столе, вы мне деинсталлятором потом весь рабочий стол затрёте? :up
Ничего отсекать/отрезать не нужно от пути установки, выполняйте действия только с $INSTDIR и не придумывайте лишнего, по-крайней мере, так безопасней для личных файлов пользователя, вам потом спасибо не скажут за удаление файлов, не относящихся к программе, запомнят ваш ник и не будут потом ставить от вас репаки :)
Kopejkin
03-06-2015, 21:05
..выполняйте действия только с $INSTDIR »
Собственно, так и делал до сих пор. Только "не аккуратненько как-то получается" :)
Только "не аккуратненько как-то получается" »
Это да, но никто пользователя и не заставляет вводить кучу путей для установки с заведомо пустыми папками, чтобы сама программа была в каких-то дебрях :)
В голову пришла такая идея, можно реализовать опять же циклом такую штуку: проверяем, является ли каталог пустым, начиная с $INSTDIR, если пустой - удаляем и "поднимаемся вверх" по дереву папок, делая аналогичную проверку, если папка снова пустая - снова удаляем и ползём ещё выше :)
разомни пальчики комбинациями ctrl+c и ctrl+v :teeth:
!include "FileFunc.nsh"
!include "Logiclib.nsh"
StrCpy $0 "$INSTDIR"
${While} $0 != "" ; если $0 = пустое значение, значит каталог либо с файлами, либо не существует
${DirState} "$0" $1 ; получаем статус директории (пустая/с файлами)
${If} $1 == "1" ; если с файлами, то обнуляем $0 и тем самым выходим из цикла
${OrIf} $1 == "-1"" ; или если папка не существует, то обнуляем $0 и тем самым выходим из цикла
DetailPrint "папка '$0' с файлами или не существует => прекращаем проверку"
StrCpy $0 "" ; обнуляем переменную с путём, чтобы завершить цикл
${ElseIf} $1 == 0 ; если папка пустая
RMDir "$0" ; удаляем пустую папку
DetailPrint "папка '$0' пустая => удаляем"
${GetParent} "$0" $0 ; получаем родителя папки, которую удалили, записываем значение в эту же переменную
DetailPrint "следующая папка => '$0'"
${EndIf}
${EndWhile}
Конечно же, прописывать нужно самым последним действием в секции деинсталлятора, чтобы при начале цикла папка $INSTDIR была пустой, а то цикл сразу завершится...
Kopejkin
03-06-2015, 22:27
если я установлю ... на рабочем столе, ... деинсталлятором ... весь рабочий стол затрёте? »
Я озаботился "безопасностью файлов" пользователя и сначала сделал так:
Function .onVerifyInstDir
Var /Global MyPath
StrCpy $MyPath "$PROGRAMFILES\Aleo Software\Flash Intro and Banner Maker"
StrLen $0 $MyPath
StrCpy $0 $INSTDIR $0
StrCmp $0 $MyPath PathGood 0
Abort
PathGood:
FunctionEnd
Но подумал, что это будет выглядеть глупо, и решил вообще не давать пользователю никакой возможности смены пути установки. Если автор программы хочет иметь общую папку для всех своих продуктов, то почему я должен быть против этого?
В итоге, страница выбора папки установки в инсталляторе была отключена :teeth: И не затрется ничего.
WesternLight
17-06-2015, 21:42
Доброго времени всем! Прошу помощи - второй день только разбираю NSIS и столкнулся с, на мой взгляд, неразрешимой проблемой :(
Требуется в процессе работы инсталлятора создать ярлык на рабочем столе, который будет содержать следующую команду, к примеру:
"C:\Program Files (x86)\Opera\launcher.exe" "http://google.com"
При этом часть:
C:\Program Files (x86)\Opera\launcher.exe
будет в виде переменной и может принимать разные значения (разные браузеры). Может есть какое-то решение?
Вообще конечная цель - ярлык на рабочем столе, который будет открывать определенный URL с помощью конкретно указанного браузера, отличного от дефолтного. Может есть какой-то обходной путь?
столкнулся с, на мой взгляд, неразрешимой проблемой »
Персонально для тех, кому лень прочитать шапку темы: Справочник по NSIS (http://forum.oszone.net/thread-168287.html)
Приходите с прочитанным справочником, кидать вам код таких простых команд - не вижу смысла
WesternLight
18-06-2015, 17:32
Приходите с прочитанным справочником, кидать вам код таких простых команд - не вижу смысла »
Почему-то думал что именно вы сразу поймете в чем кроется суть проблемы, ну, чтож...
Справочник по NSIS изучил в нужной для этого части в первую очередь (и сразу заметил некоторые неточности), много прочел в других источниках. Видимо, проблему придется описать подробнее. Мой код:
; Define your application name
!define APPNAME "Полезные ссылки"
!define APPNAMEANDVERSION "Полезные ссылки 1.0"
; Main Install settings
Name "${APPNAMEANDVERSION}"
InstallDir "$PROGRAMFILES\Полезные ссылки"
InstallDirRegKey HKLM "Software\${APPNAME}" ""
OutFile "d:\Links\Полезные ссылки.exe"
; Modern interface settings
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "nsDialogs.nsh"
!define MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_WELCOME
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; Set languages (first is default language)
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_LANGDLL
Var Dialog
Var Label1
Var Label2
Var Label3
Var Label4
Var Label5
Var Label6
Var RadioButton1
Var RadioButton2
Var RadioButton3
Var RadioButton4
Var RadioButton5
Var Browser
Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog
;Label 1
${NSD_CreateLabel} 0 0 100% 15u "Выберите браузер, в котором будет открываться страница $\"Полезные ссылки$\":"
Pop $Label1
;RadioButton 1
${NSD_CreateRadioButton} 0 20 100% 15u "В браузере по умолчанию (рекомендуется*)"
Pop $RadioButton1
;Если файл есть, то создаем RadioButton 2, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Google\Chrome\Application\chrome.exe" 0 notcreate2
${NSD_CreateRadioButton} 0 50 100% 15u "В Google Chrome"
Pop $RadioButton2
Goto rb3
notcreate2:
${NSD_CreateLabel} 0 55 100% 15u " X Браузер Google Chrome не установлен"
Pop $Label2
rb3:
;Если файл есть, то создаем RadioButton 3, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Mozilla Firefox\firefox.exe" 0 notcreate3
${NSD_CreateRadioButton} 0 80 100% 15u "В Mozilla Firefox"
Pop $RadioButton3
Goto rb4
notcreate3:
${NSD_CreateLabel} 0 85 100% 15u " X Браузер Mozilla Firefox не установлен"
Pop $Label3
rb4:
;Если файл есть, то создаем RadioButton 4, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Opera\launcher.exe" 0 notcreate4
${NSD_CreateRadioButton} 0 110 100% 15u "В Opera"
Pop $RadioButton4
Goto rb5
notcreate4:
${NSD_CreateLabel} 0 115 100% 15u " X Браузер Opera не установлен"
Pop $Label4
rb5:
;Если файл есть, то создаем RadioButton 5, иначе создаем надпись, что браузер не установлен
IfFileExists "$PROGRAMFILES\Internet Explorer\iexplore.exe" 0 notcreate5
${NSD_CreateRadioButton} 0 140 100% 15u "В Internet Explorer"
Pop $RadioButton5
Goto rb6
notcreate5:
${NSD_CreateLabel} 0 145 100% 15u " X Браузер Internet Explorer не установлен"
Pop $Label5
rb6:
${NSD_CreateLabel} 0 170 100% 35u "* Браузер, выбранный по умолчанию в системе. Пользователь в любой момент может его изменить и после этого страница может перестать открываться корректно. Если это произойдет, просто запустите программу установки еще раз и выберите нужный браузер."
Pop $Label6
nsDialogs::Show
FunctionEnd
Function fnCustomDestroy
;Состояние RadioButton 1
${NSD_GetState} $RadioButton1 $RadioButton1
;Если файл есть, то получаем состояние RadioButton 2, иначе идем далее
IfFileExists "$PROGRAMFILES\Google\Chrome\Application\chrome.exe" 0 +2
${NSD_GetState} $RadioButton2 $RadioButton2
;Если файл есть, то получаем состояние RadioButton 3, иначе идем далее
IfFileExists "$PROGRAMFILES\Mozilla Firefox\firefox.exe" 0 +2
${NSD_GetState} $RadioButton3 $RadioButton3
;Если файл есть, то получаем состояние RadioButton 4, иначе идем далее
IfFileExists "$PROGRAMFILES\Opera\launcher.exe" 0 +2
${NSD_GetState} $RadioButton4 $RadioButton4
;Если файл есть, то получаем состояние RadioButton 5, иначе идем далее
IfFileExists "$PROGRAMFILES\Internet Explorer\iexplore.exe" 0 +2
${NSD_GetState} $RadioButton5 $RadioButton5
IntCmp $RadioButton1 1 equal1 notequal1
equal1:
StrCpy $Browser ""
Goto End1
notequal1:
IntCmp $RadioButton2 1 equal2 notequal2
equal2:
StrCpy $Browser "$PROGRAMFILES\Google\Chrome\Application\chrome.exe"
Goto End1
notequal2:
End1:
FunctionEnd
Section "Полезные ссылки" Section1
;Set Section properties
SetOverwrite on
;Set Section Files and Shortcuts
SetOutPath "$INSTDIR\"
File "Links\fs.ico"
;Создание файлов
SetShellVarContext all
CreateShortCut "$DESKTOP\Полезные ссылки.lnk" "$Browser http://google.com" "" "$INSTDIR\fs.ico" "0"
CreateDirectory "$SMPROGRAMS\Полезные ссылки"
CreateShortCut "$SMPROGRAMS\Полезные ссылки\Полезные ссылки.lnk" "$Browser http://google.com" "" "$INSTDIR\fs.ico" 0
CreateShortCut "$SMPROGRAMS\Полезные ссылки\Uninstall.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
Section -FinishSection
WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe"
WriteUninstaller "$INSTDIR\uninstall.exe"
SectionEnd
;Uninstall section
Section Uninstall
;Remove from registry...
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
DeleteRegKey HKLM "SOFTWARE\${APPNAME}"
;Delete self
Delete "$INSTDIR\uninstall.exe"
;Delete Shortcuts
SetShellVarContext all
Delete "$DESKTOP\Полезные ссылки.lnk"
Delete "$SMPROGRAMS\Полезные ссылки\Полезные ссылки.lnk"
Delete "$SMPROGRAMS\Полезные ссылки\Uninstall.lnk"
;Clean up Полезные ссылки
Delete "$INSTDIR\Полезные ссылки.url"
Delete "$INSTDIR\fs.ico"
;Remove remaining directories
RMDir "$SMPROGRAMS\Полезные ссылки"
RMDir "$INSTDIR\"
SectionEnd
;On initialization
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
;Предотвращает множественость запуска инсталлятора
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "$(^Name)") i .r1 ?e'
Pop $R0
${IfNot} $R0 == 0
MessageBox MB_OK|MB_ICONEXCLAMATION "Вы уже запустили установку $(^Name)! Проверьте открытые окна!"
Abort
${EndIf}
FunctionEnd
; eof
Первый вопрос риторический - я читал ваш справочник? Отвечать не нужно. А второй вопрос, за которым я обратился к мудрости участников этого форума заключается в том, что команды выделенные жирным, при выборе пункта "В Google Chrome" не создают ярлык на рабочем столе, у которого в свойствах в поле объект будет присутствовать следующая строка (обратите внимание на кавычки):
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "http://google.com"
Мало того, что все команды попадают только в одни кавычки "" (я пробовал ставить дополнительные кавычки, экранируя их - не помогло), которые объединяют путь к исполняемому файлу с URL, так еще из URL удаляются двоеточие и слэши. Как следствие, такой ярлык не выполняет своего назначения - открыть указанную страницу в выбранном браузере, т.е. попросту не работает. Вот и прошу помощи...
Почему-то думал что именно вы сразу поймете в чем кроется суть проблемы »
Почему то думал, что вы вообще не читали справочник, раз задаёте вопрос в стиле "как использовать переменную в команде создания ярлыка", попробуйте перечитать ваше сообщение от моего лица, как поставили вопрос - так его и поняли, такой ответ и дали
я читал ваш справочник? Отвечать не нужно »
Может, и читали, утверждать наверняка не буду, но то, что читали невнимательно - это факт
не создают ярлык на рабочем столе, у которого в свойствах в поле объект будет присутствовать следующая строка »
Ну и правильно, что не создаёт, т.к. такого файла не существует на диске, к какому файлу ярлык то будет создаваться?
Ещё раз откройте описание команды CreateShortCut и прочтите её описание
Расположение_ярлыка.lnk Путь_до_файла.exe [параметры_запуска
1-ый параметр
Путь до папки ярлыка+его имя+расширение lnk
2-ой параметр
Путь до файла, который существует на диске, к которому создаётся ярлык
3-тий параметр
параметры запуска
В вашем случае, адрес сайта - это параметр запуска
CreateShortCut "$DESKTOP\Полезные ссылки.lnk" "$Browser" "http://google.com" "$INSTDIR\fs.ico" "0"
Мало того, что все команды попадают только в одни кавычки "" (я пробовал ставить дополнительные кавычки, экранируя их - не помогло), которые объединяют путь к исполняемому файлу с URL »
Ответ дал выше - путь к файлу, к которому создаётся ярлык и адрес сайта - 2 разных параметра в команде создания ярлыка, 2ой параметр для пути к файлу и 3ий параметр как "параметры запуска приложения"
WesternLight
18-06-2015, 19:10
Спасибо!!! Просто в вашем справочнике про создание ярлыка очень мало написано - там упоминаются параметры запуска, но нет примера использования... Не сообразил, что URL нужно передавать как параметр... Еще раз спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC