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

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. Файл настроек я решил переименовать, что бы он не конфликтовал по наименованию с файлом ответов.

K.A.V.
17-09-2011, 16:55
У меня такой вопрос возник: Почему не компилируется устанвощик с такой строкой
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"

K.A.V.
17-09-2011, 17:51
А почему тогда так работает?
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"

sawe
18-09-2011, 02:01
Автор программы Ангус Джонсон неоднократно заявлял, что не планирует продолжать Resource Hacker. Однако 16 сентября 2011 года программа вновь была обновлена, на этот раз до release-версии 3.6.0.92. В ней была добавлена поддержка иконок в формате .PNG.

Я тот-же её перевёл для себя Resource Hacker 3.6.0.92 Rus (http://rghost.ru/22775461)
Перезалил...
---

MaGoth
18-09-2011, 21:53
sawe, Установил вашу версию сборки Resource Hacker'а, установщик малось наглючило от плагина скина. После завершения процесса установки вывело пустое окно инсталляции без какой либо инфы, с еррором скина. Закрывал инсталлер через убиение процесса в диспетчере задач.
Собственно вопрос, чем вам не угодил стандартный скин Нсис?! :dont-know

sawe
18-09-2011, 23:02
Собственно вопрос, чем вам не угодил стандартный скин Нсис? »

Это прошлый век, серые унылые окна.....

MaGoth
22-09-2011, 02:00
Народ, встрял с одной проблемой, и не могу ее разрешить.
Есть задача: при установке определить существует ли один из определенных файлов (этих файлов может быть много) в каталоге назначения, и если файл например А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

MaGoth
22-09-2011, 14:11
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

vahe-91
24-09-2011, 11:13
не могу найти плагины для расаковки 7z и arc архивов, можете подсказать или отправить по пм ?

vahe-91
24-09-2011, 13:16
kotkovets, спасибо

kotkovets
24-09-2011, 13:20
vahe-91,
для аrc во вложении

sawe
24-09-2011, 16:06
Поигрался с CallGetUserSID (http://forum.ru-board.com/topic.cgi?forum=5&topic=0595&start=1220) и обнаружил интересные положительные свойства этого макроса, ещё раз спасибо!




© OSzone.net 2001-2012