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

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 я сделал. Теперь наворачивать его надо.

sawe
06-05-2011, 22:15
Хотел бы посоветоваться с Мэтрами 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)

sawe
07-05-2011, 13:32
Все нормально работает.
В функции .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