Цитата 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, моя любимая фраза для новичков, которую я не люблю повторять