Показать полную графическую версию : [решено] Скрипт неправильно вносит изменения в hosts
Этот скрипт вносит изменения в 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
Да сейчас стало с новой строки, но теперь при внесении второго адреса или повторного запуска скрипта, получается пробел.
# 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
megaloman, Спасибо.
Не могли бы вы сделать ещё так, что бы при повторном запуске, адреса не дублировались.
То есть, при запуске скрипт проверял бы, если такие адреса уже есть, то пропускал бы их.
Не могли бы вы сделать ещё так, что бы при повторном запуске, адреса не дублировались. »
Я знал! Я знал! :lol:
Iska, что вы имеете ввиду ?
Что чем больше мне помогают, тем больше мне хочется.
Если так, то конечно хочется, что бы всё работало не так сяк, а хорошо.
А просьбы появляются, по тому, что сразу эти проблемы не видны (я ведь не специалист).
И, что бы потом конечным результатом могли пользоваться другие не сталкиваясь с такими проблемами и не создавали лишних тем.
Или я ещё что то делаю не так ?
чем больше мне помогают, тем больше мне хочется. » :yahoo:
Ну вот всех развеселил.
А как же насчёт того, что бы помочь ?
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
megaloman, спасибо, но я ничего в этом не понимаю.
Что это, для чего и как вставить:
Процедуру :GrantAccess и её вызов Call :GrantAccess hosts вставьте самостоятельно »
В итоге получилось.
Скрипт:
1. снимает защиту
2. вносит изменения
3. возвращает защиту
4. не дублирует адреса
5. вносит адрес как положено с новой строки
P.S Ошибок никаких не заметил. Меня полностью устраивает, то чего и хотел.
Спасибо megaloman.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.