Показать полную графическую версию : [решено] Нужен .vbs скрипт для внесения изменений в hosts
Помогите написать .vbs скрипт для внесения изменений в hosts,
желательно чтобы при повторном запуске он проверял, если указанный в нём адрес уже существует,
то он бы не прописывал его второй раз, а либо переписывал либо игнорировал.
P.S: У меня есть .cmd, но он при каждом запуске добавляет новую строку (сколько раз запустишь столько и строк)
У меня есть .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. Можно ли на его основе создать скрипт
(поставил подчёркивания чтобы показать расстояние иначе при сохранении сообщения они принимают одинаковый вид) »
Достаточно использовать предназначенный для того тэг «code».
Помогите, хотя бы отредактировать .bat чтобы он только прописывал адрес, но не создавал файл отката внесённых изменений.
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 не стоит(если ты не кулхацкер)...
y--, Спасибо огромное. И отдельное за совет.
Извините, как поставить благодарность не знаю.
Извините, как поставить благодарность не знаю. »
http://i.imgur.com/pnWaxdF.png
Обнаружил небольшую проблемку и есть её решение, но нужна помощь т.к я в этом не силён.
Проблема такая, в коде нет снятия защиты с 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")
Не дублирует адреса
Возвращает защиту
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.