![]() |
Нужен .vbs скрипт для внесения изменений в hosts
Помогите написать .vbs скрипт для внесения изменений в hosts,
желательно чтобы при повторном запуске он проверял, если указанный в нём адрес уже существует, то он бы не прописывал его второй раз, а либо переписывал либо игнорировал. P.S: У меня есть .cmd, но он при каждом запуске добавляет новую строку (сколько раз запустишь столько и строк) |
Цитата:
|
Цитата:
Код:
>>"%SystemRoot%\System32\drivers\etc\hosts" echo 127.0.0.1 XXX.XXX.com |
Это для внесения изменений:
Скрытый текст
@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 |
Нашёл .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. Можно ли на его основе создать скрипт |
Цитата:
|
Помогите, хотя бы отредактировать .bat чтобы он только прописывал адрес, но не создавал файл отката внесённых изменений.
|
BKPB,
Лень не есть хорошо - ну да ладно - код другой(твой мне не нравится): Код:
@ECHO OFF |
y--, Спасибо огромное. И отдельное за совет.
Извините, как поставить благодарность не знаю. |
Цитата:
Так:
![]() |
Обнаружил небольшую проблемку и есть её решение, но нужна помощь т.к я в этом не силён.
Проблема такая, в коде нет снятия защиты с 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 Помогите сделать так, чтобы перед внесением изменений защита снималась, а после обратно восстанавливалась. Можно конечно запускать их по очереди, но хотелось бы чтобы это было одним файлом. А то сейчас приходится использовать три файла сценария, один снимает защиту, второй вносит изменения, третий возвращает защиту. |
Огромное спасибо за помощь 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") Не дублирует адреса Возвращает защиту |
Время: 13:48. |
Время: 13:48.
© OSzone.net 2001-