Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
16-09-2011, 16:10
У меня вызывает затруднение, что здесь могут присутствовать две ошибки »
ClearErrors
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${If} ${Errors}
#тут пишется код, если нету параметра Winamp_Back
${ElseIf} '$2' == '$ClassName' # в $2 значение параметра Winamp_Back
#тут пишется код, если значение параметра Winamp_Back=$ClassName
${Else}
#прочие значения параметра Winamp_Back
${EndIf}
wolkow70
16-09-2011, 17:13
kotkovets,
StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
${If} '$1' == '$ClassName'
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" ;(читаем в $2 значение бэкапа)
${If} ${Errors}
#тут пишется код, если нету параметра Winamp_Back
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${ElseIf} '$2' == '$ClassName' # в $2 значение параметра Winamp_Back
#тут пишется код, если значение параметра Winamp_Back=$ClassName
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${Else}
#прочие значения параметра Winamp_Back
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
${EndIf}
${Else}
${EndIf}
Так правильней?
kotkovets
16-09-2011, 19:53
Так правильней? »
Во первых перед каждой командой чтение реестра, нужно счищать принудительно флаг ошибки,
потому что, где то у вас скрипте установится 100% флаг ошибки, какой-нибудь командой, для правильной работы логики:
ClearErrors
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" ;(читаем в $2 значение бэкапа)
${If} ${Errors}
;----
${ElseIf} '$2' == '$ClassName' # в $2 значение параметра Winamp_Back
;---
${Else}
;----
${EndIf}
Во вторых, то ли вы в упор не видите очевидное,
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" ;(читаем в $2 значение бэкапа)
${If} ${Errors}
#тут пишется код, если нету параметра Winamp_Back
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
Зачем удалять значение параметра Winamp_Back которого не существует???
Учитесь читать код, а не, пардон, заниматься тупым копипастом!
wolkow70
17-09-2011, 16:41
Зачем удалять значение параметра Winamp_Back которого не существует??? »
Это я вижу, и специально написал, чтобы забить строку. На результат бы это не повлияло.
Все равно эта конструкция при тестировании не сработала.
Пока вернулся к своей конструкции, которая работает:
StrCpy $ClassName "Winamp.File.${extenstion}"
;
DeleteRegKey HKLM "SOFTWARE\Classes\$ClassName"
ReadRegStr $1 HKLM "SOFTWARE\Classes\.${extenstion}" ""
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back"
StrCmp "$1" "$ClassName" 0 +2
DeleteRegValue HKLM "SOFTWARE\Classes\.${extenstion}" ""
StrCmp "$1" "$ClassName" 0 +3
StrCmp "$2" "$ClassName" +2 0
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$2"
У меня такой вопрос возник: Почему не компилируется устанвощик с такой строкой
File /oname=$APPDATA\Winamp\Winamp.ini "$EXEDIR\WinampSet.ini"
Хочу, чтобы файл настроек WinampSet.ini копировался в профиль с переименованием в Winamp.ini. Файл настроек я решил переименовать, что бы он не конфликтовал по наименованию с файлом ответов.
У меня такой вопрос возник: Почему не компилируется устанвощик с такой строкой
File /oname=$APPDATA\Winamp\Winamp.ini "$EXEDIR\WinampSet.ini" »
Зачем вы указали $EXEDIR? Как компилятор найдёт путь к файлу, если установщик ещё не создан :o
wolkow70
17-09-2011, 17:14
А почему тогда так работает?
CopyFiles /silent "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini"
А почему тогда так работает?
CopyFiles /silent "$EXEDIR\Winamp.ini" "$APPDATA\Winamp\Winamp.ini" »
Иди-те ка, уважаемый, справочку ещё раз прочитайте внимательно и не задавайте таких глупых вопросов
1. Это совершенно 2 разные команды
2. Во 2-ом параметре команды File где вы указываете переменную $EXEDIR должен быть путь к файлу, который вы упаковываете в инсталлятор, т.е. с относительным путём к файлу скрипта с проектом, без переменных
wolkow70
17-09-2011, 18:14
Почитал справку...Допустим, сделаю так:
IfFileExists "$EXEDIR\WinampSet.ini" 0 +3
CopyFiles /silent "$EXEDIR\WinampSet.ini" "$APPDATA\Winamp\WinampSet.ini"
Rename "$APPDATA\Winamp\WinampSet.ini" "$APPDATA\Winamp\Winamp.ini"
ЗЫ: СРАБОТАЛО!
kotkovets
17-09-2011, 21:19
fFileExists "$EXEDIR\WinampSet.ini" 0 +3
CopyFiles /silent "$EXEDIR\WinampSet.ini" "$APPDATA\Winamp\WinampSet.ini"
Rename "$APPDATA\Winamp\WinampSet.ini" "$APPDATA\Winamp\Winamp.ini"
ЗЫ: СРАБОТАЛО! »
Чет вы плохо читали, лишнего накосячили :lol:, почему бы не так сразу, как говорится, через мозг и справку:
IfFileExists "$EXEDIR\WinampSet.ini" 0 +2
CopyFiles /silent "$EXEDIR\WinampSet.ini" "$APPDATA\Winamp\Winamp.ini"
Автор программы Ангус Джонсон неоднократно заявлял, что не планирует продолжать Resource Hacker. Однако 16 сентября 2011 года программа вновь была обновлена, на этот раз до release-версии 3.6.0.92. В ней была добавлена поддержка иконок в формате .PNG.
Я тот-же её перевёл для себя Resource Hacker 3.6.0.92 Rus (http://rghost.ru/22775461)
Перезалил...
---
sawe, Установил вашу версию сборки Resource Hacker'а, установщик малось наглючило от плагина скина. После завершения процесса установки вывело пустое окно инсталляции без какой либо инфы, с еррором скина. Закрывал инсталлер через убиение процесса в диспетчере задач.
Собственно вопрос, чем вам не угодил стандартный скин Нсис?! :dont-know
Собственно вопрос, чем вам не угодил стандартный скин Нсис? »
Это прошлый век, серые унылые окна.....
Народ, встрял с одной проблемой, и не могу ее разрешить.
Есть задача: при установке определить существует ли один из определенных файлов (этих файлов может быть много) в каталоге назначения, и если файл например А1. есть, то осуществить определенное дествие, если файла А1. нет, то проверить существует ли файл Б1, и т.д, как и в случае с файлом А1.
Т.е. в зависимости от наличия того или иного файла выполнить определенное действие.
Перепробовал кучу разных решений, ни одно толком не работает. Сейчас нашел одно, но при этом копируется сразу все, а не в зависимости от условия.
Вот пример этого кода:
[...]
;-------------------------------------------------------------------------------
Section one
[...]
IfFileExists "$G2ChPath\Speech_Wegelagerer_english.vdf" 0 Done
Call A1
IfFileExists "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf" 0 Done
Call B1
Done:
SectionEnd
;-------------------------------------------------------------------------------
Section -two
SectionIn RO
SetOverwrite on
.NextP1:
файлы для установки
[...]
SectionEnd
;-------------------------------------------------------------------------------
Section -three
SectionIn RO
SetOverwrite on
.NextA1:
файлы для установки
[...]
SectionEnd
;-------------------------------------------------------------------------------
Function A1
Goto .NextA1
FunctionEnd
;-------------------------------------------------------------------------------
Function P1
Goto .NextP1
FunctionEnd
;-------------------------------------------------------------------------------
[...]И так далее...
Кто что об этом думает ?!
kotkovets
22-09-2011, 12:07
MaGoth
Ты забыл о последовательности исполнения команд в NSIS, а это очень важно!
Если, к примеру перейдем по каким-то причинам к глобальной метке .NextP1, то исполнение кода начнется с этой метки,
дальше по скрипту, следовательно будет исполняться весь код начиная с метки .NextP1
Кто что об этом думает ?! »
А че тут думать, если есть общие файлы, группируем в одной секции
Section "share"
;общие файлы для установки
;[...]
SectionEnd
Далее в секции one, делаем определение файлов и в зависимости
нахождения файла: копируем группу файлов - все делается последовательно!
Section "one"
IfFileExists "$G2ChPath\Speech_Wegelagerer_english.vdf" 0 NextA1
;файлы для установки
;[...]
NextA1:
IfFileExists "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf" 0 NextB1
;файлы для установки
;[...]
NextB1:
;---
SectionEnd
А вот аналог на логической конструкции, для меня так удобнее...
Section "one"
${If} ${FileExists} "$G2ChPath\Speech_Wegelagerer_english.vdf"
;файлы для установки
;[...]
${ElseIf} ${FileExists} "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf"
;файлы для установки
;[...]
${EndIf}
SectionEnd
На примере логической конструкции выше работает принцип: если найден один из указанных файлов - копируем группу файлов, остальные группы будут игнорироваться в любом случае.
Если нужно копировать несколько групп файлов (при нахождении указанных файлов) можно делать так:
Section "one"
${If} ${FileExists} "$G2ChPath\Speech_Wegelagerer_english.vdf"
;файлы для установки
;[...]
${EndIf}
${If} ${FileExists} "$G2ChPath\Data\Speech_Wegelagerer_deutsch.vdf"
;файлы для установки
;[...]
${EndIf}
SectionEnd
kotkovets, Нет, это не прокатывает перепробовал разные варианты, вот пример:
Есть файл Ридми.тхт на диске, в зависимости от локализации в нем седьмая строка меняет значения:
1. Системные требования
1. Hardwarevoraussetzungen
Name "Cls Test"
OutFile "ClsTest.exe"
;-------------------------------------------------------------------------------
!include "TextFunc.nsh"
;-------------------------------------------------------------------------------
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "RUSSIAN" ;Russian
;-------------------------------------------------------------------------------
!insertmacro MUI_RESERVEFILE_LANGDLL
;-------------------------------------------------------------------------------
Var Lokalize
;-------------------------------------------------------------------------------
Section
${LineRead} "C:\ReadMe.txt" "7" $Lokalize
MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
${If} $Lokalize == "1. Системные требования"
MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
Call LokA
${ElseIf} $Lokalize == "1. Hardwarevoraussetzungen"
MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
Call LokB
${EndIf}
SectionEnd
;-------------------------------------------------------------------------------
Function LokA
Goto .NextAk
FunctionEnd
;-------------------------------------------------------------------------------
Function LokB
Goto .NextPb
FunctionEnd
;-------------------------------------------------------------------------------
Section -"one1"
.NextAk:
MessageBox MB_ICONINFORMATION|MB_OK "Русификация" IDOK
SectionEnd
;-------------------------------------------------------------------------------
Section -"one2"
.NextPb:
MessageBox MB_ICONINFORMATION|MB_OK "Немка" IDOK
SectionEnd
Причем, не зависимо от того как реализованы последние две секции, первый пример выше, а второй так:
Section -"one"
.NextAk:
MessageBox MB_ICONINFORMATION|MB_OK "Русификация" IDOK
.NextPb:
MessageBox MB_ICONINFORMATION|MB_OK "Немка" IDOK
SectionEnd
Выводятся сообщения обеих команд, тоже самое и с определением файлов, если файл есть, или его нет, выполняются оба условия. Это ппц какой-то.
kotkovets
22-09-2011, 15:41
kotkovets, Нет, это не прокатывает перепробовал разные варианты, вот пример: »
Я вообще не пишу скрипты по принципу "прокатывания" и тебе не советую.
Причем, не зависимо от того как реализованы последние две секции, первый пример выше, а второй так: »
А где последовательность действий, не вижу...Оно будет так работать!
секции всегда будут срабатывать, это очевидно! Во что за извращения с глобальными метками в функции с переходом в секции??????????
Пиши сразу код в вызываемой в функции, или под конструкцией.
И ты забыл очевидное, про непечатываемые символы(мессага их не показывает) - переходы на новую строку и т.д
По этому и логика твоя и не работала, а если бы логика работала и прыжок был
на метку .NextAk:, то секции one1 и one2 выполнялись в любом случае.
Пример на логике И-ИЛИ который прекрасно работает
Section ""
ClearErrors
${LineRead} "C:\Files.txt" "1" $Lokalize
${Unless} ${Errors}
${If} `$Lokalize` == "1. Системные требования$\r$\n"
${OrIf} `$Lokalize` == "1. Системные требования$\n"
${OrIf} `$Lokalize` == "1. Системные требования"
Call LokA
${EndIf}
${If} `$Lokalize` == "1. Hardwarevoraussetzungen$\r$\n"
${OrIf} `$Lokalize` == "1. Hardwarevoraussetzungen$\n"
${OrIf} `$Lokalize` == "1. Hardwarevoraussetzungen"
Call LokB
${EndIf}
${Else}
MessageBox MB_ICONINFORMATION|MB_OK "Файл не найден!" IDOK
${EndUnless}
SectionEnd
Function LokA
MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
FunctionEnd
Function LokB
MessageBox MB_ICONINFORMATION|MB_OK $Lokalize IDOK
FunctionEnd
не могу найти плагины для расаковки 7z и arc архивов, можете подсказать или отправить по пм ?
kotkovets
24-09-2011, 13:20
vahe-91,
для аrc во вложении
Поигрался с CallGetUserSID (http://forum.ru-board.com/topic.cgi?forum=5&topic=0595&start=1220) и обнаружил интересные положительные свойства этого макроса, ещё раз спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC