一、Hosts文件原理
Hosts文件位于 C:\Windows\System32\drivers\etc\hosts,优先级高于DNS解析。
- 格式:
IP地址 域名
- 屏蔽原理:将域名指向
127.0.0.1 或 0.0.0.0
二、基础批处理脚本
1. 查看当前Hosts内容
@echo off
echo 当前Hosts文件内容:
echo ===============================
type "%SystemRoot%\System32\drivers\etc\hosts"
echo ===============================
pause
2. 添加屏蔽域名
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
echo 正在添加屏蔽域名...
echo.
set "hosts_path=%SystemRoot%\System32\drivers\etc\hosts"
:: 检查是否以管理员运行
net session >nul 2>&1
if %errorLevel% neq 0 (
echo 请以管理员身份运行此脚本!
pause
exit /b 1
)
:: 要屏蔽的域名列表
set domains[0]=www.example.com
set domains[1]=ads.google.com
set domains[2]=tracking.facebook.com
set domains[3]=malicious-site.com
:: 添加屏蔽
echo. >> "%hosts_path%"
echo # ======================================= >> "%hosts_path%"
echo # 屏蔽域名添加时间:%date% %time% >> "%hosts_path%"
echo # ======================================= >> "%hosts_path%"
for /l %%i in (0,1,3) do (
set "domain=!domains[%%i]!"
find /i "!domain!" "%hosts_path%" >nul
if errorlevel 1 (
echo 127.0.0.1 !domain! >> "%hosts_path%"
echo 已屏蔽: !domain!
) else (
echo 已存在: !domain!
)
)
echo.
echo 操作完成!
ipconfig /flushdns
echo DNS缓存已刷新
pause
3. 按分类管理屏蔽列表
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
title Hosts文件管理器
:menu
cls
echo ===============================
echo Hosts文件管理工具
echo ===============================
echo 1. 屏蔽社交媒体
echo 2. 屏蔽广告域名
echo 3. 屏蔽游戏网站
echo 4. 屏蔽视频网站
echo 5. 自定义添加域名
echo 6. 查看当前屏蔽
echo 7. 恢复默认Hosts
echo 8. 退出
echo ===============================
set /p choice="请选择操作:"
if "%choice%"=="1" goto social
if "%choice%"=="2" goto ads
if "%choice%"=="3" goto games
if "%choice%"=="4" goto video
if "%choice%"=="5" goto custom
if "%choice%"=="6" goto view
if "%choice%"=="7" goto restore
if "%choice%"=="8" exit
goto menu
:social
set "list=www.facebook.com www.twitter.com www.instagram.com www.tiktok.com"
goto add_block
:ads
set "list=pagead2.googlesyndication.com ad.doubleclick.net ads.youtube.com"
goto add_block
:games
set "list=www.steampowered.com store.steampowered.com www.epicgames.com"
goto add_block
:video
set "list=www.youtube.com www.netflix.com www.twitch.tv"
goto add_block
:add_block
call :block_domains "%list%"
goto menu
:custom
set /p "domains=请输入要屏蔽的域名(多个用空格分隔): "
if "%domains%"=="" goto menu
call :block_domains "%domains%"
goto menu
:view
cls
echo 当前屏蔽的域名:
echo ===============================
findstr "^127.0.0.1" "%SystemRoot%\System32\drivers\etc\hosts"
echo ===============================
pause
goto menu
:restore
echo 正在恢复默认Hosts文件...
echo # Copyright (c) 1993-2009 Microsoft Corp. > "%SystemRoot%\System32\drivers\etc\hosts"
echo # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # This file contains the mappings of IP addresses to host names. Each >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # entry should be kept on an individual line. The IP address should >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # be placed in the first column followed by the corresponding host name. >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # The IP address and the host name should be separated by at least one >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # space. >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # Additionally, comments (such as these) may be inserted on individual >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # lines or following the machine name denoted by a '#' symbol. >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # For example: >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # 102.54.94.97 rhino.acme.com # source server >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # 38.25.63.10 x.acme.com # x client host >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # localhost name resolution is handled within DNS itself. >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # 127.0.0.1 localhost >> "%SystemRoot%\System32\drivers\etc\hosts"
echo # ::1 localhost >> "%SystemRoot%\System32\drivers\etc\hosts"
ipconfig /flushdns
echo 默认Hosts已恢复,DNS缓存已刷新!
pause
goto menu
:block_domains
setlocal
set "hosts_path=%SystemRoot%\System32\drivers\etc\hosts"
set "domains=%~1"
echo. >> "%hosts_path%"
echo # 添加时间:%date% %time% >> "%hosts_path%"
for %%d in (%domains%) do (
find /i "%%d" "%hosts_path%" >nul
if errorlevel 1 (
echo 127.0.0.1 %%d >> "%hosts_path%"
echo [添加] %%d
) else (
echo [已存在] %%d
)
)
echo 127.0.0.1 localhost >> "%hosts_path%"
ipconfig /flushdns >nul
echo DNS缓存已刷新!
pause
endlocal
goto :eof
4. 备份与还原功能
@echo off
chcp 65001 >nul
title Hosts备份管理器
set "hosts_path=%SystemRoot%\System32\drivers\etc\hosts"
set "backup_dir=%USERPROFILE%\HostsBackups"
if not exist "%backup_dir%" mkdir "%backup_dir%"
:menu
cls
echo ===============================
echo Hosts备份与还原工具
echo ===============================
echo 1. 备份当前Hosts
echo 2. 从备份还原
echo 3. 列出所有备份
echo 4. 退出
echo ===============================
set /p choice="请选择:"
if "%choice%"=="1" goto backup
if "%choice%"=="2" goto restore
if "%choice%"=="3" goto list
if "%choice%"=="4" exit
goto menu
:backup
set "timestamp=%date:/=-%_%time::=-%"
set "timestamp=%timestamp: =%"
set "backup_file=%backup_dir%\hosts_backup_%timestamp%.bak"
copy "%hosts_path%" "%backup_file%" >nul
echo 备份成功:%backup_file%
pause
goto menu
:restore
cls
echo 可用的备份文件:
echo ===============================
dir /b "%backup_dir%\*.bak"
echo ===============================
set /p "backup_file=请输入要还原的备份文件名:"
if not exist "%backup_dir%\%backup_file%" (
echo 文件不存在!
pause
goto menu
)
copy "%backup_dir%\%backup_file%" "%hosts_path%" /Y >nul
ipconfig /flushdns
echo 还原成功!DNS缓存已刷新。
pause
goto menu
:list
cls
echo 备份文件列表:
echo ===============================
dir "%backup_dir%\*.bak"
echo ===============================
pause
goto menu
三、高级功能脚本
1. 定时屏蔽(计划任务结合)
@echo off
:: 定时屏蔽脚本,可通过Windows计划任务定时执行
set "hosts_path=%SystemRoot%\System32\drivers\etc\hosts"
:: 工作时间屏蔽列表(9:00-18:00)
set "work_block=www.youtube.com www.netflix.com www.facebook.com"
:: 检查时间
for /f "tokens=1,2 delims=:" %%a in ("%time%") do (
set /a "hour=%%a"
)
if %hour% geq 9 if %hour% lss 18 (
echo # 工作时间屏蔽 %date% %time% >> "%hosts_path%"
for %%d in (%work_block%) do (
find /i "%%d" "%hosts_path%" >nul
if errorlevel 1 (
echo 127.0.0.1 %%d >> "%hosts_path%"
)
)
)
2. 白名单模式(只允许特定网站)
@echo off
chcp 65001 >nul
echo 正在启用白名单模式(只允许访问指定网站)...
echo.
set "hosts_path=%SystemRoot%\System32\drivers\etc\hosts"
:: 清空现有内容
echo # Hosts文件 - 白名单模式 > "%hosts_path%"
echo # 启用时间:%date% %time% >> "%hosts_path%"
echo. >> "%hosts_path%"
:: 系统必要地址
echo 127.0.0.1 localhost >> "%hosts_path%"
echo ::1 localhost >> "%hosts_path%"
:: 白名单域名(允许访问的网站)
echo # 白名单 >> "%hosts_path%"
echo 允许的域名:
set allow_list=www.microsoft.com update.microsoft.com windowsupdate.com
for %%d in (%allow_list%) do (
echo 0.0.0.0 %%d >> "%hosts_path%"
echo 允许:%%d
)
:: 屏蔽所有其他流量
echo # 屏蔽所有其他访问 >> "%hosts_path%"
echo 0.0.0.0 * >> "%hosts_path%"
ipconfig /flushdns
echo.
echo 白名单模式已启用!
echo 注意:此模式会阻止除白名单外的所有网络访问
pause
四、使用说明
1. 重要注意事项
- 必须使用管理员权限运行
- 修改后需要刷新DNS:
ipconfig /flushdns
- 建议先备份原始Hosts文件
- 对HTTPS网站,浏览器会有安全警告
2. 创建快捷方式
可以将常用脚本创建为桌面快捷方式:
右键批处理文件 → 发送到 → 桌面快捷方式
右键快捷方式 → 属性 → 高级 → 勾选"以管理员身份运行"
3. 增强建议
- 使用更专业的工具如AdGuard、Pi-hole
- 考虑使用Windows防火墙进行更全面的控制
- 对于企业环境,建议使用域策略或专业上网行为管理设备
五、完整管理工具整合
建议将上述功能整合为一个完整的管理工具,包含日志记录、规则导入导出等功能。
这个方案提供了从基础到高级的Hosts文件管理功能,可以根据实际需求选择使用。