Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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 выполняется при закрытии или переходе на другую страницу.
как пользоваться !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"
что вводить можно в $R5? у меня ошибку дает
kotkovets
17-08-2010, 11:49
Tolian
Я не телепат...
что вводить можно в $R5? »
Все что угодно..... :) ну или почти...
StrCpy $R5 Tolian
MessageBox MB_OK "$R5"
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,возьмитесь за учебник,читайте посты...справку
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""'
Файл вообще с расширением .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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC