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-08-2010, 18:28
CyberMaster, Поздно вечером че нибудь придумаю и отпишусь...

CyberMaster
16-08-2010, 20:32
kotkovets, спасибо буду ждать :)
P.s Вот справка на этот счет Replacing Lines in a Text File (http://nsis.sourceforge.net/Replacing_Lines_in_a_Text_File) но в аглицком мало понимаю :( Пробую разбираться...

kotkovets
17-08-2010, 01:14
Средствами NSIS я не нашел, как поменять строку в файле...может плохо искал...
Есть повод, кто умеет, писать плагин,если есть подскажите..буду благодарен

CyberMaster
В каталоге NSIS\Bin есть замечательная утилитка GenPat.exe тобишь:
1) Файл *.gam открываем блокнотом, редактируем как вам нужно, и сохраняем в файл *_new.gam
2) Создаем батник следующего содержания:
GenPat.exe "*.gam" "*_new.gam" "Path.pat"
на выходе получаем файлик Path.pat.

OutFile "test.exe"

Section
SetOutPath "Bашь путь"
File "*.gam"
SetFileAttributes "Bашь путь\*.gam" "NORMAL"
Rename "Bашь путь\*.gam" "Bашь путь\*_.gam"
InitPluginsDir
File /oname=$PLUGINSDIR\path.pat "path.pat"
vpatch::vpatchfile "$PLUGINSDIR\path.pat" "Bашь путь\*_.gam" "Bашь путь\*.gam"
Delete "Bашь путь\*_.gam"
SetFileAttributes "Bашь путь\*.gam" "READONLY"
SectionEnd

Path.pat - файл изменений.
Тобишь, файл *.gam не заменяется, а изменяется т.е патчится

CyberMaster
17-08-2010, 02:49
Спасибо за помощь
Средствами NSIS я не нашел, как поменять строку в файле »
Category:Text Files Manipulation Functions (http://nsis.sourceforge.net/Category:Text_Files_Manipulation_Functions)

Belial4444
17-08-2010, 07:29
kotkovets, спасибо с текстом разобрался. У меня новый вопрос: у меня не работает команда записи значения параметра в ини файл. Компилируется без ошибок, но после установки файл ини остается неизменным.
Function fnTextChange
Pop $1
${NSD_GetText} $Text $R0
WriteINIStr $INSTDIR\rev.ini steamclient PlayerName $R0
FunctionEnd
В установщике пользователь вводит текст, текст записывается в переменную и потом эта переменная должна записываться в ини файл, но этого не происходит.

kotkovets
17-08-2010, 09:18
Belial4444
Попробуйте вместо WriteIniStr,,,,,,,, MessageBox MB_OK "$R0"
Вы увидите содержимое $R0 или нет.... :dont-know

Function fnTextChange
Pop $1
${NSD_GetText} $Text $R0 ;считывает текст
${NSD_SetText} $Label "Текст в поле ввода: $R0"
MessageBox MB_OK "$R0"
FunctionEnd

${NSD_SetText} - обработчик событий, если ничего не измените в поле ввода , то ничего не изменится и не запишится :)
Полное описание модуля (http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html) , правда на английском.
И вообще если вы хотите записать данные в файл, то лучше делать так:

Page custom Bla Bla1
-----------------
-----------------
Function Bla1
${NSD_GetText} $Text $R0
WriteINIStr $INSTDIR\rev.ini steamclient PlayerName $R0
FunctionEnd

Функция Bla1 выполняется при закрытии или переходе на другую страницу.

Tolian
17-08-2010, 10:00
как пользоваться !insertmacro MUI_INSTALLOPTIONS_READ?

kotkovets
17-08-2010, 11:22
Tolian
Этот макрос читает секции из *.ini файла настроек и помещает результат в переменную:
!insertmacro INSTALLOPTIONS_READ $R5 "Dialog.ini" "Field 1" "State"
Точно также как ReadIniStr :
ReadINIStr $R5 "$PLUGINSDIR\Dialog.ini" "Field 1" "State"

Tolian
17-08-2010, 11:28
что вводить можно в $R5? у меня ошибку дает

kotkovets
17-08-2010, 11:49
Tolian
Я не телепат...
что вводить можно в $R5? »
Все что угодно..... :) ну или почти...

StrCpy $R5 Tolian
MessageBox MB_OK "$R5"

Tolian
17-08-2010, 11:55
kotkovets, А это верно?:


Function Show

SectionGetFlags ${11} $9

StrCmp $9 0 Next

File /oname=$*.ini "*.ini"

InstallOptions::initDialog "*.ini"

InstallOptions::Show

Next:

FunctionEnd


Function zak

!insertmacro MUI_INSTALLOPTIONS_READ $R1 "*.ini" "Field 2" "State"

!insertmacro MUI_INSTALLOPTIONS_READ $R2 "*.ini" "Field 4" "State"

Push “*.INI”

Push $R1

Push $R2

xxxx::SaveParam

Pop $R0

FunctionEnd

kotkovets
17-08-2010, 12:10
SectionGetFlags ${11} $9 »
($0 - $9) - 10 переменных которых не нужно объявлять
($R0 - $R9) - 10 переменных которых не нужно объявлять
MoiPlagin::SaveParam »
Ваш плагин ???? интересно посмотреть.....
Function ShowPage и Function LeavePage »
Эти функции откуда вызываются?

Tolian,возьмитесь за учебник,читайте посты...справку

Tolian
17-08-2010, 12:15
kotkovets, по поводу плагина, да я пытаюсь написать его...

а это функции с Page custom тянутся...

kotkovets
17-08-2010, 12:23
по поводу плагина, да я пытаюсь написать его »
Прежде чем писать плагин изучите NSIS: принципы работы и синтаксис

CyberMaster
17-08-2010, 22:34
Как сделать так, что бы если необходимый файл не найден, инсталлятор говорил типа "Файл не найден. Продолжить устоновку?"

kotkovets
17-08-2010, 23:14
CyberMaster
Section
IfFileExists "Путь к файлу" Next
MessageBox MB_ICONQUESTION|MB_YESNO "Файл не найден. Продолжить установку?" IDNO NO IDYES Next
NO:
Quit
Next:
;продолжение скрипта
SectionEnd

Belial4444
18-08-2010, 10:03
kotkovets, мне надо не вывести переменную а записать её в ини файл и для этого вроде есть только команда WriteINIStr.
У меня она выглядит так WriteINIStr "$INSTDIR\rev.ini" "steamclient" "PlayerName "$R0" и Компилируется все без ошибок. Дак почему у меня не записывается ничего?). Может тебе дать скрипт и скомпилированный вариант снова?)

kotkovets
18-08-2010, 10:55
Может тебе дать скрипт »
Давай только скрипт...
Поглядим...
мне надо не вывести переменную а записать её в ини файл »
В место WriteIniStr я подставил MessageBox в качестве примера, чтобы вы увидели содержимое $R0 ...для отладки вашего скрипта...Вы поняли? :)

kotkovets
18-08-2010, 18:05
Для участников форума выкладываю скрипт для замены строки в текстовом файле (txt, ini, inf и т.п)
Скрипт был взят отсюда (http://nsis.sourceforge.net/Replacing_Lines_in_a_Text_File) .
Я доработал скрипт,так как в оригинале скрипт создает файл-пустышку,
если указываемого в скрипте файла не существует,
что в некоторых случаях бывает недопустимо.
Собственно доработанный мною скрипт:

!include FileFunc.nsh

!define line "Oszone.net" ;Сюда пишем искомую строку для замены
!define line_replace "Oszone.forum.net" ;Сюда пишем строку замены

OutFile "Test.exe"

Section
ClearErrors
FileOpen $0 "Путь к файлу" r
GetTempFileName $R0
FileOpen $1 $R0 w
loop:
FileRead $0 $2
IfErrors done
StrCmp $2 '${line}$\r$\n' 0 +2
StrCpy $2 '${line_replace}$\r$\n'
StrCmp $2 '${line}' 0 +2
StrCpy $2 '${line_replace}'
FileWrite $1 $2
Goto loop
done:
FileClose $0
FileClose $1
${GetFileName} $R0 $R1
${Locate} $TEMP "/L=F /S=0:0B /M=$R1" "Del"
IfFileExists $R0 0 +4
CopyFiles /SILENT $R0 "Путь к файлу"
Delete $R0
Push $0
SectionEnd

Function Del
Delete $R0
Push $0
FunctionEnd

Если строка такого вида: "Oszone. "forum" ".net"" и т.п , то пишем как то так:

!define line '"Oszone."net""'
!define line_replace '"Oszone. "forum" ".net""'

hb860
19-08-2010, 01:45
Файл вообще с расширением .gam, но там текст.
Насчет редактирования забыл сказать: Если это упростит задачу, Те две строки можно удалить и записать две новые в конец файла
Собственно вот содержимое того файла:
Код:
game "Counter-Strike"
url_info "www.counter-strike.net"
url_dl ""
version "1.6"
size "184000000"
svonly "0"
secure "0"
type "multiplayer_only"
cldll "1"
hlversion "1111"
nomodels "1"
nohimodel "1"
mpentity "info_player_start"
gamedll "dlls\mp.dll"
gamedll_linux "dlls/cs_i386.so"
trainmap "tr_1"
Две строки которые нужно заменить
gamedll "dlls\mp.dll"
gamedll_linux "dlls/cs_i386.so" »

Вот я бы как сделал
!include "WordFunc.nsh"
!insertmacro WordReplace

.
.
.

FileOpen $0 $INSTDIR\file.dat a
IfErrors done
FileRead $0 $1
${WordReplace} $1 'gamedll "dlls\mp.dll"' 'gamedll dlls\newdll.dll' "+*" $R0
FileWrite $0 $R0
FileClose $0
done:

Вроде и не особо сложно




© OSzone.net 2001-2012