Показать полную графическую версию : [архив].: NSIS - все вопросы :.
так. если я все правильно понял, для каждого файла *.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 - не удалять
Условие: имя оригинала и патченного файла не должны совпадать
Прошу помощи ещё раз. *.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
Спасибо. С этим разобрался.
Для теста попробовал пропатчить 1 файл. НО!! сам патч получился ровненько размера патченого файла (т.е. патч не содержит в себе информации для "дописывания" в оригинал, а прост осодержит модиф. файл).. Это лечится? :dont-know :help:
Проблема за проблемой всплывают...
kotkovets
07-04-2011, 16:36
a--e, достаточно сравнить 2 файла по контрольной сумме (MD5, к примеру) и если они одинаковые, значит файл не пропатчен, как узнать контрольные суммы - погуглите.
kotkovets,
Нет. Файл все же не патчится. Заменяется оригинальной версией (без патча даже).
Всем привет !
Наткнулся на проблему с кодировкой 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
Здравствуйте, подскажите куда копать:
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
Если сравниваете строковые значения с лучше писать с двумя знаками ==
Если числовые то с одним знаком =
Подскажите пожалуйста, как решить такую задачу - удаление , одного или нескольких любых символов, в начале нескольких конкретных строк текстового файла. Т.е., например :
Удалить : 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
можно методом сравнения строки заменить целиком строку и код проще и гемора меньше на порядок. »
Гемора на порядок будет больше, т.к. придётся вручную вводить текст сравниваемой строки и текст необходимого результата.
Когда в текстовом файле таких строк сотни и с чёрт знает какими записями - это убийственно...
А надо всего лишь удалить несколько символов в началах этих строк. При чём только в конкретных или в группах строк...
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 вставляй с нужными параметрами
Подскажите как в функции указать переход к другой функции или возврат в начало выполнения скрипта (к первой странице инсталятора)?
kotkovets
10-04-2011, 21:29
Подскажите как в функции указать переход к другой функции »
Это извращение, проще все нужно делать, чем не устраивает простой вызов: Call Function ? из любой секции или функции..или на другой конец использование глобальных меток, где можно прыгать как угодно: Goto .Next в пределах инсталлятора, кроме секции Uninstall, и командой Return
возврат в начало выполнения скрипта »
а не проще цикл организовать (по условию) в одном месте, чем прыгать и скакать - выносить себе мозги.
ИМХО, в студию проблемный кусок скрипта.. а там видно будет, что и как "правильнее делать"
Нашел выход в команде 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC