Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт неправильно вносит изменения в hosts (http://forum.oszone.net/showthread.php?t=339838)

BKPB 25-03-2019 18:09 2865079

Скрипт неправильно вносит изменения в 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 2865087

Если тупо, c минимумом изменений,без анализа наличия добавляемой строки
Код:

(Echo.&echo 127.0.0.1 geekuninstaller.com)>>hosts

BKPB 25-03-2019 18:52 2865089

Да сейчас стало с новой строки, но теперь при внесении второго адреса или повторного запуска скрипта, получается пробел.
Скрытый текст
# 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 2865097

BKPB, Давайте разберёмся. Почему так получилось?
Цитата:

Цитата 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 2865160

megaloman, Спасибо.

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

Iska 26-03-2019 07:47 2865161

Цитата:

Цитата BKPB
Не могли бы вы сделать ещё так, что бы при повторном запуске, адреса не дублировались. »

Я знал! Я знал! :lol:

BKPB 26-03-2019 08:08 2865164

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

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

yurfed 26-03-2019 08:36 2865168

Цитата:

Цитата BKPB
чем больше мне помогают, тем больше мне хочется. »

:yahoo:

BKPB 26-03-2019 08:51 2865169

Ну вот всех развеселил.

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

Iska 26-03-2019 17:41 2865228

Цитата:

Цитата BKPB
Iska, что вы имеете ввиду ? »

Вот именно это:
Цитата:

Цитата BKPB
И, что бы потом конечным результатом могли пользоваться другие не сталкиваясь с такими проблемами и не создавали лишних тем. »

— потому как Вы не первый, не второй, и даже не третий, но со всё тем же самым вопросом и — та-дам — с новой темой. И каждый раз всё развивается по одному и тому же сценарию, начиная с «cmd/bat» и «добавить», плавно переходя к вопросу «новых и пустых строк», и, рано или поздно, но обязательно добираясь до «не дублировались».

megaloman 26-03-2019 19:52 2865265

BKPB, Подозреваю, что эта тема решалась на портале сто раз. Изначально подозревал, что малыми правками дело не ограничится.
Вот мой вариант. От Вашего взял два аттриба. Вставить можно много строк. Скрипт изведёт дублирующиеся строки, если они есть и не комментарии. Увы, съест пустые строки. Возможно, скрипт заткнётся, если встретятся по тексту спецсимволы.
Процедуру :GrantAccess и её вызов Call :GrantAccess hosts вставьте самостоятельно
Код:

@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 2865339

megaloman, спасибо, но я ничего в этом не понимаю.
Что это, для чего и как вставить:
Цитата:

Цитата BKPB
Процедуру :GrantAccess и её вызов Call :GrantAccess hosts вставьте самостоятельно »


BKPB 27-03-2019 13:17 2865345

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

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

Спасибо megaloman.


Время: 23:19.

Время: 23:19.
© OSzone.net 2001-