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

a--e
07-04-2011, 13:38
так. если я все правильно понял, для каждого файла *.pat файл надо создавать отдельно?! О_о
Вот моя ошибка. Я постоянно директории сравнивал (на выходе файл получался, но чего-то не работало))
кусок скрипта выше это доля одного файла, а для X файлов его надо копировать n раз. так что ли?? тогда все крайне просто. Спасибо за помощь. Если будут ещё вопросы - вернусь в гости)

*Ушел убивать клавиатуру.


PS а можно патчу прикрутить авто установку в директорию по ключу в реестре?

kotkovets
07-04-2011, 13:52
так. если я все правильно понял, для каждого файла *.pat файл надо создавать отдельно? »
совершенно верно, нужно для каждого файла, и файл .pat для конкретного файла свой
я скрипты писал и на 7000 строк и нормально, дело тренировки, можно для этих дел макрос сварганить и 15 раз вызывать.

Вот такой макрос для себя делал, пользуйтесь:

Page Instfiles
Name "Example"
OutFile "Example.exe"
ShowInstDetails show

!define VPatchFile "!insertmacro VPatchFile"
!macro VPatchFile PATCHDATA SOURCEFILE TEMPFILE VALUE
Push $1
Push $2
Push $3
Push $4
Push `${SOURCEFILE}`
Push `${TEMPFILE}`
Pop $2
Pop $3
InitPluginsDir
GetTempFileName `$1` $PLUGINSDIR
File `/oname=$1` `${PATCHDATA}`
vpatch::vpatchfile `$1` `$3` `$2`
Pop $4
StrCpy $4 $4 2
StrCmp $4 "OK" +4
SetErrors
DetailPrint "Vpatch: error"
Goto +6
IntCmp ${VALUE} 1 0 +6 +6
IfFileExists `$2` 0 +4
Delete $3
Rename /REBOOTOK `$3` `$2`
Delete $1
Pop $4
Pop $3
Pop $2
Pop $1
!macroend

Section "Main"
SetOutPath "$EXEDIR"
File "D:\Nero_designer\Nero Burning ROM\nero.exe"
${VPatchFile} "Nero.pat" "$EXEDIR\Nero.exe" "Nero Express.exe" 1
SectionEnd
Nero.pat - должен лежать рядом со скриптом
Nero Express.exe - имя пропатченного файла, т.е сохраниться с указанным именем в одной директории оригинального файла
1- удалить оригинал, 0 - не удалять
Условие: имя оригинала и патченного файла не должны совпадать

a--e
07-04-2011, 15:28
Прошу помощи ещё раз. *.pat файлы получил. все идёт как надо. Но запнулся при написании скрипта



OutFile "test.exe"

Section
SetOutPath "C:\"
File "c:\Temp\{app}\data\Effects.vfs"
SetFileAttributes "c:\Temp\{app}\data\Effects.vfs" "NORMAL"
Rename "c:\Temp\{app}\data\Effects.vfs" "c:\Temp\{app}\data\NEW_Effects.vfs"
InitPluginsDir
File /oname=$PLUGINSDIR\path.pat "Effects.vfs.pat"
vpatch::vpatchfile "$PLUGINSDIR\Effects.vfs.pat" "c:\Temp\{app}\data\NEW_Effects.vfs" "c:\Temp\{app}\data\Effects.vfs"
Delete "c:\Temp\{app}\data\NEW_Effects.vfs"
SetFileAttributes "c:\Temp\{app}\data\Effects.vfs" "READONLY"
SectionEnd



"Error in script "stdin" on line 9 -- aborting creation process" - вот что мне говорят (
пробовал менять имя pat файла в этой строке. Без результата.

kotkovets
07-04-2011, 16:15
a--e,
скачайте на 92 стр. темы справочник, там есть ответы на ваши вопросы..

File /oname=$PLUGINSDIR\path.pat "Effects.vfs.pat"
Означает взять Effects.vfs.pat и скопировать в папку $PLUGINSDIR с именем path.pat
далее ясно почему ошибка...
Delete "c:\Temp\{app}\data\NEW_Effects.vfs" и никогда не применяйте абсолютные пути в скриптах, кроме забора файлов в инсталлятор.
Delete "$PLUGINSDIR\path.pat"
Почитайте в справочнике про переменные окружения
OutFile "test.exe"

Section
SetOutPath "c:\"
File "c:\Temp\{app}\data\Effects.vfs"
InitPluginsDir
File /oname=$PLUGINSDIR\Effects.vfs.pat "Effects.vfs.pat"
vpatch::vpatchfile "$PLUGINSDIR\Effects.vfs.pat" "c:\Effects.vfs" "c:\path_Effects.vfs"
Delete "c:\Effects.vfs"
Rename "c:\path_Effects.vfs" "c:\Effects.vfs"
SectionEnd

a--e
07-04-2011, 16:30
Спасибо. С этим разобрался.
Для теста попробовал пропатчить 1 файл. НО!! сам патч получился ровненько размера патченого файла (т.е. патч не содержит в себе информации для "дописывания" в оригинал, а прост осодержит модиф. файл).. Это лечится? :dont-know :help:
Проблема за проблемой всплывают...

kotkovets
07-04-2011, 16:36
a--e, достаточно сравнить 2 файла по контрольной сумме (MD5, к примеру) и если они одинаковые, значит файл не пропатчен, как узнать контрольные суммы - погуглите.

a--e
07-04-2011, 16:44
kotkovets,
Нет. Файл все же не патчится. Заменяется оригинальной версией (без патча даже).

racner
07-04-2011, 21:09
Всем привет !

Наткнулся на проблему с кодировкой NSIS при вызове команды nsExec::ExecToLog,
при использовании русской Windows.

; Restart services

nsExec::ExecToLog "cmd /u /c net stop SharedAccess"
nsExec::ExecToLog "Test 31 Петя пошел гулять"
DetailPrint "Stopping service... Русские буквы, тест 33333 "
nsExec::ExecToLog "cmd /a /c net stop iphlpsvc"
DetailPrint "Stopping service... Русские буквы, тест 22222 "
nsExec::ExecToLog "net stop winmgmt"

Вот что пишется выводится при установке:

http://img-fotki.yandex.ru/get/5603/neronovey.0/0_5ea22_21234cd1_L.jpg

Если выполнить соответствующие команды вручную в cmd, то всё ок:

http://img-fotki.yandex.ru/get/5302/neronovey.0/0_5ea20_a9e190cd_L.jpg

То есть дело в том, какая кодировка настроена для вывода текста в окне лога установки через команду nsExec::ExecToLog, как её переключить подскажите пожалуйста ?

P.S. как вы видите я экспериментировал с параметрами команды cmd:
/a - вывод в ANSI
/u - вывод в UNICODE
результата это не дало никакого.
В то же время команда DetailPrint выводит кириллицу нормально

kotkovets
07-04-2011, 22:27
То есть дело в том, какая кодировка настроена для вывода текста в окне лога установки через команду nsExec::ExecToLog, как её переключить подскажите пожалуйста ? »
Проблема в самом плагине nsExec - не поддерживает кириллицу, он же строки такие передает в ListBox (окно деталей) установщика. буржуи писали... :dont-know

Proton
08-04-2011, 07:34
Здравствуйте, подскажите куда копать:

1. Делаю установщик с введение пароля , создаю через nsDialogs первый лист, на нем строка ввода и кнопка далее, если пароль неверный сообщение, что неверно ввели : выход или повторить. Выход работает, а вот повтор немогу реализовать.
Как в функции указать запуск установщика с начала? Пробовал указать на сколько команд вернуться назад, но при этом перестает показываться текстовое поле.


Page custom dogovor_vvod dogovor_confirm
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI 2\LicenseRU.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_LANGUAGE "Russian"

;--------------------------------
;установка
;--------------------------------
Var dogovor
Var textdogov
Var numberdogov

Function dogovor_vvod
nsDialogs::Create 1018
!insertmacro MUI_HEADER_TEXT "Введите номер договора с ISP PalNet" "Если вы не являетесь пользователем сети PalNet, прервите установку и удалите данное приложение"
Pop $dogovor
${NSD_CreateText} 30% 30% 90u 12u ""
Pop $textdogov
nsDialogs::Show
FunctionEnd

Function dogovor_confirm
Loop:
${NSD_GetText} $textdogov $numberdogov
${if} $numberdogov != "nsis"
MessageBox MB_ICONSTOP|MB_YESNO " $\r$\nНеверный номер договора! $\r$\nПопробовать снова?$\r$\n $\r$\n" IDYES Loop
Goto End
${else}
Goto Next
${endif}
End:
Quit
Next:
FunctionEnd


Как реализовать переход Loop?


2. Как сделать чтобы пароль проверялся по первым 4 символам? Имеется ли какие нибудь спец символы вроде как *

${if} $numberdogov != "nsis*"

kotkovets
08-04-2011, 10:00
Здравствуйте, подскажите куда копать »
Поле ввода пароля: ${NSD_CreatePassword}
Как сделать чтобы пароль проверялся по первым 4 символам? »
Очень просто, нужно брать из введенного пароля первые 4 символа

Function dogovor_confirm
${NSD_GetText} $textdogov $numberdogov
StrCpy $numberdogov $numberdogov 4
${ifnot} $numberdogov == nsis ;если не равно "nsis"
MessageBox MB_ICONSTOP "Неверный пароль !!!"
Abort ; конец иницилизации
${endif}
FunctionEnd
Если сравниваете строковые значения с лучше писать с двумя знаками ==
Если числовые то с одним знаком =

MKN
08-04-2011, 10:20
Подскажите пожалуйста, как решить такую задачу - удаление , одного или нескольких любых символов, в начале нескольких конкретных строк текстового файла. Т.е., например :

Удалить : 1ый любой символ в начале строк с 37 по 68 включительно.

Или : удалить 3 первых любых символа в строках с 10 по 20 и 3 первых любых символа, в 33 строке.

В справочнике ничего подходящего не обнаружил...

ps Если удление сделать нельзя, то хотя бы заменить символ на пустой...

kotkovets
08-04-2011, 12:01
MKN, А зачем удалять, когда можно методом сравнения строки заменить целиком строку и код проще и гемора меньше на порядок.
вот к примеру есть строка: forum.oszone.ru
${WordReplace} '$R9' 'forum.oszone.ru' 'я на forum.oszone.ru - изучаю NSIS' "+" '$R9'
в итоге заменится строка forum.oszone.ru на я на forum.oszone.ru - изучаю NSIS
а параметры замены в оригинале смотри по индексу WordReplace или Word.
а если строку нужно удалить:
${WordReplace} '$R9' 'forum.oszone.ru' '' "+" '$R9'
Но останется пустая строка, как ее удаллить смотри здесь:
http://forum.oszone.net/post-1645122-1011.html

MKN
08-04-2011, 12:24
можно методом сравнения строки заменить целиком строку и код проще и гемора меньше на порядок. »
Гемора на порядок будет больше, т.к. придётся вручную вводить текст сравниваемой строки и текст необходимого результата.

Когда в текстовом файле таких строк сотни и с чёрт знает какими записями - это убийственно...

А надо всего лишь удалить несколько символов в началах этих строк. При чём только в конкретных или в группах строк...

MKN
08-04-2011, 13:22
kotkovets,
Я почти нашёл, то что нужно в TextFunc.nsh
Когда в файл примера вставляешь :


;Удалить 1 символ в строках со 2 по 5 включительно

Section
${LineFind} "C:\a.txt" "C:\a.txt" "2:5-1" "LineReplaceFunction"
SectionEnd

Function LineReplaceFunction
${TrimNewLines} '$R9' $R9
StrCpy $R9 $R9 '' 1
StrCpy $R9 '$R9$\r$\n'

Push $0
FunctionEnd

то вроде как всё работает, но только в примере, а отдельно нет... И в том примере так много всего лишнего...

kotkovets
08-04-2011, 13:24
MKN,а все таки справку по вордовским хренотенью плохо смотрел... там куча параметров в вхождение в строку : в начале , в середину, с какого символа, на длину и т.д
макрос ${LineFind} "[File1]" "[File2|/NUL]" "[LineNumbers]" "Function"
взгляни к примеру:
$R9 - строковые значения
$R8 - номер линии строки текста
[LineNumbers]
1;-1 - все линии читать
5:9 - читать с 5 до 9 линии
в справке все это есть же.
WordFind, WordReplace, WordFind2X в функции LineReplaceFunction вставляй с нужными параметрами

Proton
10-04-2011, 16:02
Подскажите как в функции указать переход к другой функции или возврат в начало выполнения скрипта (к первой странице инсталятора)?

kotkovets
10-04-2011, 21:29
Подскажите как в функции указать переход к другой функции »
Это извращение, проще все нужно делать, чем не устраивает простой вызов: Call Function ? из любой секции или функции..или на другой конец использование глобальных меток, где можно прыгать как угодно: Goto .Next в пределах инсталлятора, кроме секции Uninstall, и командой Return
возврат в начало выполнения скрипта »
а не проще цикл организовать (по условию) в одном месте, чем прыгать и скакать - выносить себе мозги.
ИМХО, в студию проблемный кусок скрипта.. а там видно будет, что и как "правильнее делать"

Proton
11-04-2011, 01:59
Нашел выход в команде Abort - прекращение выполнения скрипта дальше, возможно это извращение но мне помогло

Page custom dogovor_vvod dogovor_confirm
;!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI 2\LicenseRU.txt"
!insertmacro MUI_PAGE_COMPONENTS
;!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

;--------------------------------
;установка
;--------------------------------
Var dogovor
Var textdogov
Var numberdogov

Function dogovor_vvod
nsDialogs::Create 1018
!insertmacro MUI_HEADER_TEXT "Введите номер договора с ISP PalNet" "Если вы не являетесь пользователем сети PalNet, прервите установку и удалите данное приложение"
Pop $dogovor
${NSD_CreateText} 30% 30% 90u 12u ""
Pop $textdogov
nsDialogs::Show
FunctionEnd

Function dogovor_confirm
${NSD_GetText} $textdogov $numberdogov
StrCpy $numberdogov $numberdogov 3
${ifnot} $numberdogov == pal ;если не равно pal*****
MessageBox MB_ICONSTOP|MB_YESNO " $\r$\nНеверный номер договора! $\r$\nПопробовать снова?$\r$\n $\r$\n" IDNO End
Abort
${else}
Goto Next
${endif}
End:
Quit
Next:
FunctionEnd

и дальше по тексту скрипта.
если есть более разумный выход при неверно введеных данных вернуться в начало выполнения скрипта, поделитесь идеей

kotkovets
11-04-2011, 11:47
Proton, Что за извращения с метками в логических конструкциях(((...
Конструкции для того и существуют, чтобы метки (безусловные переходы) не использовать...
здесь вариант на относительном переходе внутри конструкции, которая выполняется только, когда введен неправильный пароль, т.е по заданному условию в логике.

${NSD_GetText} $textdogov $numberdogov
StrCpy $numberdogov $numberdogov 3
${IfNot} $numberdogov == pal ;если не равно pal***** тогда ниже команды будут выполнены до закрытия конструкции ${EndIf}
MessageBox MB_ICONSTOP|MB_YESNO "Неверный номер договора!$\r$\nПопробовать снова?" IDNO +2
Abort
Quit
${EndIf}
FunctionEnd

У вас страничка с вводом пароле первая, и вы никуда ни денетесь со странички, пока не введете верный пароль или откажетесь от ввода пароля - тогда выход. Че здесь мутить по меткам хренотень.
Скачайте Справочник по NSIS (http://forum.oszone.net/showpost.php?p=1569008) и почитайте про логические конструкции.




© OSzone.net 2001-2012