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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Нужен .vbs скрипт для внесения изменений в hosts (http://forum.oszone.net/showthread.php?t=327600)

BKPB 14-06-2017 18:34 2744598

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

P.S: У меня есть .cmd, но он при каждом запуске добавляет новую строку (сколько раз запустишь столько и строк)

shisik 14-06-2017 19:19 2744604

Цитата:

Цитата BKPB
У меня есть .cmd, но он при каждом запуске добавляет новую строку (сколько раз запустишь столько и строк) »

Ну так может его стоит продемонстрировать?

Iska 14-06-2017 21:53 2744637

Цитата:

Цитата shisik
Ну так может его стоит продемонстрировать? »

Давайте я продемонстрирую :):
Код:

>>"%SystemRoot%\System32\drivers\etc\hosts" echo 127.0.0.1 XXX.XXX.com

BKPB 15-06-2017 07:56 2744701

Это для внесения изменений:

Скрытый текст
@echo off
cd /d "%windir%\system32\drivers"
cd etc

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

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


Это скрипт, чтобы .bat запускался без показа окна:

Скрытый текст
et WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "Change.hosts.bat" & Chr(34), 0
Set WshShell = Nothing

BKPB 15-06-2017 11:32 2744747

Нашёл .bat который игнорирует адрес если такой уже внесён.

Скрытый текст
@Echo Off
setlocal EnableDelayedExpansion

set sHostFile=%SystemRoot%\System32\drivers\etc\hosts

:: добавление записи в hosts
call :Install 1111.com
:: пишем скрипт отката записи в hosts
call :cl 1111.com

exit /b


:Install
set sHost=%~1

if defined sHost (
for /f "usebackq eol=# tokens=1,2" %%i in ("%sHostFile%") do (
if /i "%%j"=="%sHost%" Set flag=1
)
If not defined flag (echo.127.0.0.1 %sHost%>>"%sHostFile%")
)
goto :eof

:cl
(
echo @Echo Off
echo setlocal enabledelayedexpansion
echo.
echo set sHostFile=%%SystemRoot%%\System32\drivers\etc\hosts
echo set sHost=%~1
echo.
echo for /f "tokens=1* delims=]" %%%%a in ^('find /v /n "" ^^^<"%%sHostFile%%"'^) do ^(
echo echo.%%%%b ^| ^>nul find /i "%%sHost%%" ^|^| ^(echo.%%%%b^>^>"%%SystemRoot%%\System32\drivers\etc\temp_host"^)
echo ^)
echo del /f /q "%%sHostFile%%"
echo ren "%%SystemRoot%%\System32\drivers\etc\temp_host" "hosts"
echo exit /b
)>cl_hosts.cmd
goto :eof


Но осталось два вопроса:

1. Как исправить этот .bat чтобы он только прописывал адрес, но не создавал файл отката внесённых изменений.
2. Можно ли на его основе создать скрипт

Iska 15-06-2017 13:22 2744781

Цитата:

Цитата BKPB
(поставил подчёркивания чтобы показать расстояние иначе при сохранении сообщения они принимают одинаковый вид) »

Достаточно использовать предназначенный для того тэг «code».

BKPB 17-06-2017 15:46 2745407

Помогите, хотя бы отредактировать .bat чтобы он только прописывал адрес, но не создавал файл отката внесённых изменений.

y-- 18-06-2017 10:52 2745539

BKPB,
Лень не есть хорошо - ну да ладно - код другой(твой мне не нравится):
Код:

@ECHO OFF
REM Файл для обработки
SET "WORK_FILE=%SystemRoot%\System32\drivers\etc\hosts"
REM Список блокируемых доменов через запятую
SET "BLOCK_DOMAIN=domain1.com,domain2.ru,domain3.net"
FOR %%i IN (%BLOCK_DOMAIN%) DO CALL :WORK "%%~i"
GOTO :EOF
:WORK
FINDSTR /B /I /C:"127.0.0.1" "%WORK_FILE%"|FINDSTR /I /C:"%~1"||(
ECHO 127.0.0.1 %~1>>"%WORK_FILE%"
)
GOTO :EOF

Запуск от имени админа, права переопределять на hosts не стоит(если ты не кулхацкер)...

BKPB 18-06-2017 11:54 2745542

y--, Спасибо огромное. И отдельное за совет.

Извините, как поставить благодарность не знаю.

Iska 18-06-2017 14:59 2745600

Цитата:

Цитата BKPB
Извините, как поставить благодарность не знаю. »

Так:

BKPB 25-06-2017 13:44 2747165

Обнаружил небольшую проблемку и есть её решение, но нужна помощь т.к я в этом не силён.

Проблема такая, в коде нет снятия защиты с hosts,
обнаружил я это не сразу т.к у себя я её снял и поэтому код на моём ПК работал, а вот на других не вносит изменения.
Скрытый текст
@ECHO OFF
REM Файл для обработки
SET "WORK_FILE=%SystemRoot%\System32\drivers\etc\hosts"
REM Список блокируемых доменов через запятую
SET "BLOCK_DOMAIN=domain1.com,domain2.ru,domain3.net"
FOR %%i IN (%BLOCK_DOMAIN%) DO CALL :WORK "%%~i"
GOTO :EOF
:WORK
FINDSTR /B /I /C:"127.0.0.1" "%WORK_FILE%"|FINDSTR /I /C:"%~1"||(
ECHO 127.0.0.1 %~1>>"%WORK_FILE%"
)
GOTO :EOF


Вот код для снятия защиты, заменив в нём -R на +R защита восстанавливается.
Возможно в нём что то лишнее.
Скрытый текст
@echo off
cd /d "%windir%\system32\drivers"
cd etc

Call :GrantAccess hosts
attrib -R hosts
goto :eof

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


Помогите сделать так, чтобы перед внесением изменений защита снималась, а после обратно восстанавливалась.
Можно конечно запускать их по очереди, но хотелось бы чтобы это было одним файлом.
А то сейчас приходится использовать три файла сценария,
один снимает защиту, второй вносит изменения, третий возвращает защиту.

BKPB 28-06-2017 11:40 2747795

Огромное спасибо за помощь FlasherX с сайта www.cyberforum.ru.

Вот скрипт который он написал:
Скрытый текст
Domains = Split("idb.iobit.com anysite.net")

With CreateObject("Scripting.FileSystemObject")
Set F = .GetFile(.GetSpecialFolder(1) & "\drivers\etc\hosts")
End With : A = F.Attributes
All = F.OpenAsTextStream(1).ReadAll
If (A And 1) = 1 Then F.Attributes = A - 1 : T = 1

With New RegExp
.MultiLine = True : .IgnoreCase = True
For Each Dom In Domains
.Pattern = "^(0\.0\.0\.0|121\.0\.0\.1)[\t ]" & Replace(Dom, ".", "\.") & "\b"
If Not .Test(All) Then _
With F.OpenAsTextStream(8) .WriteLine "121.0.0.1 " & Dom : .Close : End With
Next
End With : If T Then F.Attributes = A


Скрипт выполняет следующее:
Снимает защиту
Вносит изменения. В этой строке нужные адреса, сечйчас прописано два адреса. Domains = Split("idb.iobit.com anysite.net")
Не дублирует адреса
Возвращает защиту


Время: 20:36.

Время: 20:36.
© OSzone.net 2001-