Войти

Показать полную графическую версию : [решено] Скрипт неправильно вносит изменения в hosts


BKPB
25-03-2019, 18:09
Этот скрипт вносит изменения в hosts, но не совсем правильно.
@echo off
cd /d "%windir%\system32\drivers"
cd etc

Call :GrantAccess hosts
attrib -R -S -H hosts
echo 127.0.0.1 geekuninstaller.com>>hosts
attrib +R hosts
goto :eof

:GrantAccess
takeown /f "%~1"
echo y|cacls "%~1" /g %username%:f
exit /b
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost127.0.0.1 geekuninstaller.com
И поэтому ни чего не блокируется.
Нужно сделать, чтобы он вносил изменения с новой строки, вот так:
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 geekuninstaller.com

megaloman
25-03-2019, 18:40
Если тупо, c минимумом изменений,без анализа наличия добавляемой строки(Echo.&echo 127.0.0.1 geekuninstaller.com)>>hosts

BKPB
25-03-2019, 18:52
Да сейчас стало с новой строки, но теперь при внесении второго адреса или повторного запуска скрипта, получается пробел.
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 geekuninstaller.com

127.0.0.1 geekuninstaller.com

127.0.0.1 geekuninstaller.com
И правильно ли я добавляю второй адрес ?
@echo off
cd /d "%windir%\system32\drivers"
cd etc

Call :GrantAccess hosts
attrib -R -S -H hosts
(Echo. &echo 127.0.0.1 geekuninstaller.com)>>hosts
(Echo. &echo 127.0.0.1 live.com)>>hosts
attrib +R hosts
goto :eof

:GrantAccess
takeown /f "%~1"
echo y|cacls "%~1" /g %username%:f
exit /b

megaloman
25-03-2019, 20:19
BKPB, Давайте разберёмся. Почему так получилось?
# ::1 localhost127.0.0.1 geekuninstaller.com »
Потому, что строка # ::1 localhost127
не оканчивается символами с кодами 0D 0A, которые в обычном текстовом редакторе Вы не видите.
Я сделал очень тупо: я никак не проанализировал, как завершается Ваша последняя строка.
Я добавил Echo.
чтобы организовать эти два символа в конце последней строки.
echo 127.0.0.1 geekuninstaller.com уже запишет в файл строку с этими символами.
Поэтому если добавляете еще одну строку, нет смысла добавлять еще раз эти символы посредством Echo.
Именно это приводит к лишней пустой строке.
(Echo. &echo 127.0.0.1 live.com)>>hosts

BKPB
26-03-2019, 07:28
megaloman, Спасибо.

Не могли бы вы сделать ещё так, что бы при повторном запуске, адреса не дублировались.
То есть, при запуске скрипт проверял бы, если такие адреса уже есть, то пропускал бы их.

Iska
26-03-2019, 07:47
Не могли бы вы сделать ещё так, что бы при повторном запуске, адреса не дублировались. »
Я знал! Я знал! :lol:

BKPB
26-03-2019, 08:08
Iska, что вы имеете ввиду ?
Что чем больше мне помогают, тем больше мне хочется.
Если так, то конечно хочется, что бы всё работало не так сяк, а хорошо.
А просьбы появляются, по тому, что сразу эти проблемы не видны (я ведь не специалист).
И, что бы потом конечным результатом могли пользоваться другие не сталкиваясь с такими проблемами и не создавали лишних тем.

Или я ещё что то делаю не так ?

yurfed
26-03-2019, 08:36
чем больше мне помогают, тем больше мне хочется. » :yahoo:

BKPB
26-03-2019, 08:51
Ну вот всех развеселил.

А как же насчёт того, что бы помочь ?

Iska
26-03-2019, 17:41
Iska, что вы имеете ввиду ? »
Вот именно это:
И, что бы потом конечным результатом могли пользоваться другие не сталкиваясь с такими проблемами и не создавали лишних тем. »
— потому как Вы не первый, не второй, и даже не третий, но со всё тем же самым вопросом и — та-дам — с новой темой. И каждый раз всё развивается по одному и тому же сценарию, начиная с «cmd/bat» и «добавить», плавно переходя к вопросу «новых и пустых строк», и, рано или поздно, но обязательно добираясь до «не дублировались».

megaloman
26-03-2019, 19:52
BKPB, Подозреваю, что эта тема решалась на портале сто раз. Изначально подозревал, что малыми правками дело не ограничится.@Echo Off
cls
Set "File=hosts."
Set "Folder=%windir%\system32\drivers\etc"

Pushd "%Folder%"||(Pause &Exit /B 2)

Set "@Add001=127.0.0.1 geekuninstaller.com"
Set "@Add002=127.0.0.1 live.com"
Set "@Add003=127.0.0.1 "тра ля ля live.com""

Attrib -R -S -H "%File%"

Set /A NOld=1000
FOR /F "usebackq delims=" %%s IN ("%File%") DO (Set /A NOld+=1 &Call Set "@Old%%NOld%%=%%s")
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@Add"`) DO (Set /A NOld+=1 &Call Set "@Old%%NOld%%=%%j")
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@Old"`) DO (Set "SS=%%j" &Call Set "@%%i=%%SS: =%%")

>"%File%" (FOR /L %%i IN (1001,1,%NOld%) DO Call :Anal %%i)
attrib +R "%File%"
Popd
GoTo :Eof

:Anal
Call Set "A=%%@@Old%1%%"
If /I "%A%"=="" Exit /B 1
If "%A:~0,1%"=="#" (Call Echo %%@Old%1%%&Exit /B 0)
(Call Echo %%@Old%1%%)
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@@Old"`) DO If /I "%%j"=="%A%" Call Set "%%i="
Exit /B 0

BKPB
27-03-2019, 12:24
megaloman, спасибо, но я ничего в этом не понимаю.
Что это, для чего и как вставить:
Процедуру :GrantAccess и её вызов Call :GrantAccess hosts вставьте самостоятельно »

BKPB
27-03-2019, 13:17
В итоге получилось.
Скрипт:
1. снимает защиту
2. вносит изменения
3. возвращает защиту
4. не дублирует адреса
5. вносит адрес как положено с новой строки

P.S Ошибок никаких не заметил. Меня полностью устраивает, то чего и хотел.

Спасибо megaloman.




© OSzone.net 2001-2012