Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Цитата Dodakaedr:
как я уже и раньше говорил - примерчик. »
Я вам его предоставил, но вопрос тут в том, что вы не можете им воспользоваться по одной простой причине - вы не знаете базовой информации о NSIS и как вообще пишутся скрипты, поэтому рекомендую начать штудировать наш справочник, особенно страничку о переменных, которая бы помогла решить вашу проблему с моим примером.

Цитата Dodakaedr:
Собрал такое, но не работает »
А с чего бы "такому" работать?

Код: Выделить весь код
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext:
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${LineRead} "$DESKTOP\hosts" "$R4" $R5 ; читаем содержимое строки
 ${WordFind} "$R3" "127.0.0.1 winxpregp.narod.ru" "E+1{" $R2 ; ищем фразу в строке
 ${WordFind} "$R5" "127.0.0.1 winxp.narod.ru" "E+1{" $R6  ; ищем фразу в строке
 IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineFind} "$DESKTOP\hosts" "" "$R4" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0 ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow
Первая выделенная строка.
Ошибка чтения строки, почему? Потому что вы передаёте ранее не задействованную переменную $R4 с пустым значением, соответственно, никакая строка прочитана не будет

Вторая выделенная строка.
Т.к. выше была ошибка чтения строки, то и поиск фразы будет неудачным

Третья выделенная строка.
Т.к. было выше 2 ошибки, никакая строка удалена не будет

Вы просто наугад подставили переменные и думали, что код магическим образом заработает?

Если бы вы прочли наш справочник, то смогли бы создать 1 глобальную переменную, в которую бы помещали фразу для поиска и вызывали бы мою написанную функцию сколько угодно раз.
Скрытый текст

Код: Выделить весь код
Function test 
Var /global MyText
StrCpy $MyText "winxpregp.narod.ru"
 call DeleteLineFunc
 
StrCpy $MyText "microsoft.com"
 call DeleteLineFunc
 
StrCpy $MyText "oszone.net"
 call DeleteLineFunc  
FunctionEnd


Function DeleteLineFunc
${LineSum} "$DESKTOP\hosts" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обновляем счетчик, в этой переменной будет хранится порядковый номер строки, которая читается в данный момент
readnext: 
 IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
 IntCmp $R1 $R0 0 0 end ; если текущее значение читаемой строки больше, чем общее количество строк в файле - завершаем обработку и прыгаем на метку end 
 readlinenow: ; сюда будем прыгать после удаления строки, необходимо после удаления строки ещё раз прочитать эту же строку, т.к. данные в файле будут "сдвинуты" после удаления строки
 ${LineRead} "$DESKTOP\hosts" "$R1" $R3 ; читаем содержимое строки
 ${WordFind} "$R3" "$MyText" "E+1{" $R2 ; ищем фразу в строке
   IfErrors readnext 0 ; если фраза не найдена - прыгаем на метку readnext и  читаем следующую строку, если фраза найдена - спускаемся дальше по коду
 ${LineFind} "$DESKTOP\hosts" "" "$R1" "DeleteLineCallback" ; удалем строку, в которой найдена фраза, передавая номер удаляемой строки
 ${LineSum} "$DESKTOP\hosts" $R0  ; после попытки удаления строки желательно обновить данные о количестве строк в файле, если удалений строк с фразой будет много - будут лишние команды чтения строк
 goto readlinenow ; после удаления строки нужно прочитать эту строку ещё раз, т.к. данные в файле сразу же сдвигаются, прыгаем на метку readlinenow 
end:
FunctionEnd

Function DeleteLineCallback
	StrCpy $0 SkipWrite
	Push $0
FunctionEnd


Читайте Справочник по NSIS, моя любимая фраза для новичков, которую я не люблю повторять

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:19, 16-05-2015 | #1632