Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
04-05-2011, 16:46
kotkovets,
Работает даже еще проще, просто:
ReadEnvStr $R0 "PATH"
StrCpy $R0 "E:\Documents and Settings\Администратор\Local Settings\Application Data\Opera"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
SectionEnd
Я себе так сделал через SysDrive:
Var SysDrive
Function un.onInit
SectionSetText ${sec09} "Удалить Opera"
StrCpy $SysDrive $WINDIR 2
FunctionEnd
ReadEnvStr $R0 "PATH"
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
;
ReadEnvStr $R1 "PATH"
StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"
SectionEnd
kotkovets
04-05-2011, 17:46
wolkow70
Скажу прямо, не обижайтесь, у меня сложилось впечатление, что вы не имеете ни малейшего понятия об использовании переменных NSIS, системных переменных и переменных окружения.
Вот на кой черта эти записи, въехать никак не могу...
ReadEnvStr $R0 "PATH" - считывает с реестра в переменную $R0 значениие системной переменной %path%
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" - и тут же в переменную $R0 помещаете другое значение... ($SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\)
тупо... причем по ходу извлекая букву системного диска...а вопрос зачем получили значение из реестра в переменную $R0 и тут же ее переписАли :o
wolkow70
04-05-2011, 18:19
wolkow70
Скажу прямо, не обижайтесь, у меня сложилось впечатление, что вы не имеете ни малейшего понятия об использовании переменных NSIS, системных переменных и переменных окружения.
Вот на кой черта эти записи, въехать никак не могу...
ReadEnvStr $R0 "PATH" - считывает с реестра в переменную $R0 значениие системной переменной %path%
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" - и тут же в переменную $R0 помещаете другое значение... ($SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\)
тупо... причем по ходу извлекая букву системного диска...а вопрос зачем получили значение из реестра в переменную $R0 и тут же ее переписАли »
Вы меня не поняли...
В скрипте у меня только это:
Var SysDrive
Function un.onInit
SectionSetText ${sec09} "Удалить Opera"
StrCpy $SysDrive $WINDIR 2
FunctionEnd
ReadEnvStr $R0 "PATH"
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
;
ReadEnvStr $R1 "PATH"
StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"
SectionEnd
Удаляются две папки в разных диреториях.
А то, что я вначале написано это для примера.
А взято все из справки, чего там не правильно, если все работает, как нужно?...
kotkovets
04-05-2011, 18:31
а что так не катит...
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\
StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"
"
и вообще это просто так можно
управляя пользователями через SetShellVarContext all или SetShellVarContext current
"$LOCALAPPDATA\Opera\"
"$APPDATA\Opera\"
wolkow70
04-05-2011, 18:49
То есть вы хотите сказать , что строка
ReadEnvStr $R0 "PATH" - лишняя?
Но ведь она есть в примере справки, а от нее я не отступал.
Вот что буквально приведено в справке:
ReadEnvStr $R0 "PATH"
StrCpy $R0 "$R0;C:\MYAPP"
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", R0).r0'
ReadEnvStr $R0 "PATH"
StrCpy $R0 "$R0;C:\MYAPP"
SetEnv::SetEnvVar "PATH" $R0
и вообще это просто так можно
управляя пользователями через SetShellVarContext all или SetShellVarContext current
"$LOCALAPPDATA\Opera\"
"$APPDATA\Opera\" »
Мы еще вчера выяснили и эксперементально подтвердилось, что в результате в папку администратора не попадаем!
Сносятся папки в в профилях "User" и "All users". А профиль "Администратор" , да еще в русской транскрипции это вообше другое...
А главное в моем варианте ВСЕ РАБОТАЕТ как надо, почему следует считать это тупостью...
wolkow70
04-05-2011, 19:06
а что так не катит... »
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\ »
А что тут должно катить, если значению "PATCH" ничего не присвоено?
kotkovets,
Провел эксперемент - закомментировал строки :
;ReadEnvStr $R0 "PATH".
Все равно работает. Вы оказались правы.
kotkovets
04-05-2011, 22:47
:o :) улыбнулось даже..........................................
достаточно так..и усё
RMDir /r "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
Но ведь она есть в примере справки, а от нее я не отступал.
Вот что буквально приведено в справке:
ReadEnvStr $R0 "PATH" - считывает с реестра в переменную $R0 значениие системной переменной %path%
StrCpy $R0 "$R0;C:\MYAPP" ; дописываем в $R0 C:\MYAPP
System::Call 'Kernel32::SetEnvironmentVariableA(t, t) i("PATH", R0).r0' ; через WinAPI устанавливаем новое значение системной переменной %PATH%»
ДАЛЬШЕ.... как там у вас...
ReadEnvStr $R0 "PATH"
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" ;тут перезапись $R0
SetEnv::SetEnvVar "PATH" $R0 ;вообще это к чему, не пришей, а прибей...%Path%
RMDir /r "$R0\" »
Вот тока значение $R0 остается неизменной после StrCpy. Разницу чуете... :shocked:
wolkow70
05-05-2011, 05:08
RMDir /r "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\" »
И что NSIS поймет русское название папки?
Инсталлятор я доделал. Все нормально работает.
Но хочу еще доработать. Возник в связи с этим такой вопрос:
У меня перед самой инсталляцией предусмотрена полная очистка системы от следов предыдущей установки Opera. Реализуется первой секцией, в таком виде:
Section "Удаление предыдущей установки Opera" sec01
DeleteRegKey HKLM "SOFTWARE\Classes\Applications\Opera.exe" ""
DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Opera.exe" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.wgt" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.xht" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.xhtm" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\.xhtml" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Widget" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Protocol" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Widget" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.Extension" ""
DeleteRegKey HKLM "SOFTWARE\Classes\Opera.HTML" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Clients\Mail\Opera" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Clients\News\Opera" ""
DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Clients\StartMenuInternet\Opera.exe" ""
RMDir /r "$PROGRAMFILES\Opera"
;
SetShellVarContext current
RMDir /r "$APPDATA\Opera\"
RMDir /r "$LOCALAPPDATA\Opera\"
;
SetShellVarContext all
RMDir /r "$APPDATA\Opera\"
RMDir /r "$LOCALAPPDATA\Opera\"
;
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
Delete "$Desktop\${PRODUCT_NAME}.lnk"
Delete "$QUICKLAUNCH\${PRODUCT_NAME}.lnk"
;
StrCpy $R0 "$SysDrive\Documents and Settings\Администратор\Local Settings\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R0
RMDir /r "$R0\"
;
StrCpy $R1 "$SysDrive\Documents and Settings\Администратор\Application Data\Opera\"
SetEnv::SetEnvVar "PATH" $R1
RMDir /r "$R1\"
Вопрос такой: можно ли при этом средствами NSIS произвести бэкап имеющихся профилей, что бы непотерять закладки, пароли, экспресс-панель, историю посещений и т.д?
То есть механизм:
1. Бэкап (желательно созданием архива в директории, в которой создается новый профиль) .
2. Очиста.
3. Новая установка.
kotkovets
05-05-2011, 12:39
И что NSIS поймет русское название папки? »
а в значении переменной $R0 зелененькие буквы, что ли ))))))))))))))))))))))))))
Вопрос такой: можно ли при этом средствами NSIS произвести бэкап имеющихся профилей, что бы непотерять закладки, пароли, экспресс-панель, историю посещений и т.д? »
Можно, себе делал так. Берем из архиватора 7-Zip: 7z.dll и 7z.exe
OutFile file.exe
!include "LogicLib.nsh"
Page components
Page instfiles
Function .onInit
InitPluginsDir
File "/oname=$PLUGINSDIR\7z.dll" "C:\Program Files\7-Zip\7z.dll"
File "/oname=$PLUGINSDIR\7z.exe" "C:\Program Files\7-Zip\7z.exe"
FunctionEnd
Section "упаковка"
nsExec::Exec `"$PLUGINSDIR\7z.exe" a "C:\1.7z" "D:\Новая папка"`
Pop $0 ;код возврата, если со стека возвратится в переменную $0 - 0 то, успешно
StrCmp $0 0 +2
Call Errors
SectionEnd
Section "распаковка"
nsExec::Exec `"$PLUGINSDIR\7z.exe" x "C:\1.7z" -o"C:\1" -y`
Pop $0
StrCmp $0 0 +2
Call Errors
SectionEnd
Function Errors
${Select} $0
${Case2} Error 2
StrCmp $0 Error 0 +2
MessageBox MB_ICONSTOP|MB_OK "Ошибка запуска! Файл 7z.exe не найден!" IDOK
StrCmp $0 2 0 +2
MessageBox MB_ICONSTOP|MB_OK "Фатальная ошибка!" IDOK
Abort
${Case} 1
MessageBox MB_ICONINFORMATION|MB_OK "О_о... Что то не то...!" IDOK
${Case} 7
MessageBox MB_ICONSTOP|MB_OK "Ошибка командной строки!" IDOK
Abort
${EndSelect}
FunctionEnd
Все дополнительные ключи, параметры из справки 7-Zip - там все расписано.
Просьба не задавать откровенно глупые и ламерские вопросы, лучше лишний раз проверить, сделать отладку, почитать справки.
shanishki
05-05-2011, 16:50
Прошу помощи!
Дело в том что меня задолбал яндекс.бар в различных инсталляторах NSIS (exe).
Можно ли из инсталяшки удалять YandexPackSetup.msi ?
kotkovets
05-05-2011, 17:22
Можно ли из инсталяшки удалять YandexPackSetup.msi ? »
нет, только полной переупаковкой инсталлятора, причем скрипт с нуля придется писать и знать процесс инсталляции "оригинала"
wolkow70
05-05-2011, 18:40
Мне большую помощь оказывает программа RegSnap.
Делаю снимок до инсталляции, после инсталляции (до запуска программы) и снимок после первого запуска программы и смотрю последовательность и состав изменений в реестре и файловой системе.
Дальше уже проще...
Еще полезна утилита RegDllView.exe, можно после устанвоки посмотреть, какие библиотеки зарегистрировались при установке программы.
Конвертор Reg2NSIS оказывает большую помощь, но комманды часто коряво конвертит....
Хороший шаблон нужно себе сделать, что бы не тратить зря время, и дело пойдет.
Я себе в сборке eMule так делал без упаковки:
IfFileExists "$INSTDIR\config\*.ini" 0 +2
IfFileExists "$INSTDIR\config\*.dat" 0 +2
IfFileExists "$INSTDIR\config\*.met" 0 +2
IfFileExists "$INSTDIR\config\*.txt" 0 +2
IfFileExists "$INSTDIR\config\*.tmpl" 0 +2
IfFileExists "$INSTDIR\config\*.bak" 0 +2
IfFileExists "$INSTDIR\config\*.old" 0 +2
MessageBox MB_YESNO|MB_ICONQUESTION "В папке назначения обнаружены файлы настроек предыдущей установки eMule, хотите сохранить файлы ранее сделанных настроек программы? (Вы сможете найти их в папке $INSTDIR\config\BACKUP)" IDNO no_backup
CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.ini" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.dat" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.met" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.txt" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.tmpl" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.bak" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.old" "$INSTDIR\config\BACKUP\"
kotkovets
05-05-2011, 22:39
CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.ini" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.dat" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.met" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.txt" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.tmpl" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.bak" "$INSTDIR\config\BACKUP\"
CopyFiles "$INSTDIR\config\*.old" "$INSTDIR\config\BACKUP\" »
попроще можно жешь...
CreateDirectory "$INSTDIR\config\BACKUP\"
CopyFiles /silent "$INSTDIR\config\*" "$INSTDIR\config\BACKUP"
wolkow70
06-05-2011, 06:16
попроще можно жешь... »
Там было много лишних файлов, поэтому сделал по маске.
В принципе, для Opera попробую сделаю как Вы написали, там трудно понять, что лишнее, а что нет. Надо разобраться какие файлы нужны, и продумать механизм восстановления настроек по выбору.
Например:
секция: "Восстановление закладок"
секция: "Восстановление паролей"
секция: "Восстановление Экспресс-панели"
секция "Восстановление истории посещений"
и т.д.
Сам то инсталлятор Opera я сделал. Теперь наворачивать его надо.
Хотел бы посоветоваться с Мэтрами NSIS-а!
Windows 7 и Vista имеет ряд ограничений на папку C:\Program Files.
При установке некоторых программ а так же игр (не имеющий профиля), следует выбирать другую папку установки.
То есть при установки в Windows 7 и Vista предлагать по умолчанию другую папку (к примеру Games\XXX), в других Windows предлагать стандартно C:\Program Files\XXX.
Написал простую логику, но при выборе другой папки или диска терялась \XXX , переписал заново вроде всё работает, но я не уверен полностью.
Прошу проверить!
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
XPStyle on
!include WinVer.nsh
Var SysDrive
Var INSTIPE
Var SETUPDIR
Function .onInit
Pop $0
StrCpy $INSTIPE "$PROGRAMFILES"
${If} ${IsWinVista}
StrCpy $SysDrive $WINDIR 2
StrCpy $INSTIPE "$SysDrive\Games"
${ElseIf} ${IsWin7}
StrCpy $SysDrive $WINDIR 2
StrCpy $INSTIPE "$SysDrive\Games"
${EndIf}
StrCpy $INSTDIR "$INSTIPE\XXX"
StrCpy $SETUPDIR "$INSTDIR"
FunctionEnd
OutFile "XXX_setup.exe"
InstallDir "$SETUPDIR\XXX"
Page directory
Section -XXX
SectionEnd
kotkovets
06-05-2011, 23:57
sawe,
Все нормально работает.
В функции .onInit уберите Pop $0 - нехорошо обращаться к пустому стэку.
А я бы сделал, гораздо проще:
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
XPStyle on
!include WinVer.nsh
Function .onInit
${If} ${AtLeastWinVista} ;начиная от WinVista и выше
Var /global SysDrive ; иницилизируем здесь, в ниже версиях Windows SysDrive - не используется
StrCpy $SysDrive $WINDIR 2
StrCpy $INSTDIR "$SysDrive\Games\XXX"
${Else}
StrCpy $INSTDIR "$PROGRAMFILES\XXX"
${EndIf}
FunctionEnd
OutFile "XXX_setup.exe"
Page directory
Section -XXX
SectionEnd
wolkow70
07-05-2011, 10:11
kotkovets,
В справке тоже много не понятного.
Вот сделал так:
IfFileExists "$EXEDIR\pkey.txt" 0 NoThere
MessageBox MB_OK "Файл лицензии есть"
CopyFiles /silent "$EXEDIR\pkey.txt" "$INSTDIR\pkey.txt"
Goto Done
NoThere:
MessageBox MB_OK "Файла лицензии нет"
Done:
SectionEnd
Не понятно, как теперь скрыть MB если запускать с ключом /S через IfSilent...
kotkovets
07-05-2011, 11:55
Не понятнео, как теперь скрыть MB если запускать с ключом /S через IfSilent. »
Есть 2 способа, через ключ /SD
MessageBox MB_OK "Файл лицензии есть" /SD IDOK
Через флаг тихого режима.
IfSilent +2
MessageBox MB_OK "Файл лицензии есть"
Все это есть и многое другое в
Справочнике по NSIS (http://narod.ru/disk/1645638001/NSIS_Help.zip.html)
Все нормально работает.
В функции .onInit уберите Pop $0 - нехорошо обращаться к пустому стэку.
А я бы сделал, гораздо проще: »
Спасибо за консультацию, но ты тоже наступил на те же грабли или не прочёл последнюю строку
но при выборе другой папки или диска терялась \XXX , переписал заново вроде всё работает, но я не уверен полностью.
убрать в начале Pop $0 - это у меня ошибка закралась (перед ним был ещё код, который нужно было очистить)
wolkow70
07-05-2011, 13:52
Все это есть и многое другое в
Справочнике по NSIS »
Вот в чем хотелось бы разобраться, дак это в создании Генератора ответов, а в Вашей справке этот вопрос очень куце освещен. Уже давно ломаю голову над этой проблемой.
Кто нибудь разъяснил бы на примере скрипта AIMP что там реализовано.
Пока написал так:
StrCpy $WindowCaption "${PRODUCT_NAME} ${PRODUCT_VERSION}"
${WordReplace} "$EXEFILE" ".exe" ".ini" "+" $IniFile
StrCpy $IniFile "$EXEDIR\$IniFile"
;gMode detection
StrCpy $gMode 0
${GetOptions} $CMDLINE "/G" $0
;if not found /G then exit
IfErrors CheckViolation 0
;When Silent setup then ignoring /G
IfSilent +4 0
StrCpy $gMode 1
Delete $IniFile
StrCpy $WindowCaption "Генератор файла ответов ${PRODUCT_NAME}"
Запускается генератор и все, что дальше делать не понятно....
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC