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

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

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

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


Contributor


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

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


Цитата Dodakaedr:
если у файла hosts стоит атрибут "только чтение", то снять его, записать некоторое значение и снова поставить атрибут "только чтение", а если атрибута нету то просто записать значение? »
Код: Выделить весь код
Function test
${GetFileAttributes} "$DESKTOP\hosts" "READONLY" $R0 ; проверяем, есть ли атрибут только чтение у файла, если после исполнения команды $R0 = 1, значит есть
StrCmp $R0 "1" 0 +2 ; если атрибут есть, то ставим файлу обычный атрибут
SetFileAttributes "$DESKTOP\hosts" "NORMAL" 
  
FileOpen $0 "$DESKTOP\hosts" a ; открываем файл для добавления данных
FileSeek $0 0 END ; перескакиваем на последнюю строку в файле
FileWrite $0 "$\r$\n127.0.0.1 winxpregp.narod.ru" ; добавляем новую строку
FileClose $0 ; закрываем файл, завершаем с ним работу
  
StrCmp $R0 "1" 0 +2  ; т.к. переменная $R0 до сих пор хранит инфу о том, был ли атрибут только чтение у файла, тут же проверяем, если был - ставим обратно атрибут только чтение
SetFileAttributes "$DESKTOP\hosts" "READONLY"
FunctionEnd
Цитата Dodakaedr:
И как удалять значение из файла hosts? »
Вы не представляете, сколько уже раз здесь задавались вопросы по поводу работы с обычными текстовыми файлами...
Но такого кода ещё не было, свежачок
Код: Выделить весь код
Function test2
${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" "winxpregp.narod.ru" "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
ps
в начале кода пропишите
Код: Выделить весь код
!include "FileFunc.nsh"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

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


Последний раз редактировалось K.A.V., 14-05-2015 в 23:11. Причина: забыл про include файлы :D

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

Отправлено: 23:07, 14-05-2015 | #1625