windows中hosts文件位于C:\Windows\system32\drivers\etc下。
我们可以手动修改hosts文件,但是对于多台PC而言,每台手动修改过于麻烦,故而本文旨在便捷脚本修改hosts文件。
设计思路
- 管理员权限执行脚本,大多数电脑的hosts都是受保护的,普通权限无法修改,故而需要管理员权限执行。
- 备份原有的hosts,避免修改错了无法还原。
- 修改hosts的读写权限,不分电脑的hosts仅有只读权限,不允许修改,如果不修改权限的话,无法覆写成功。
- 追加IP 域名,如果当前ip 域名已经存在则跳过,仅添加未存在的内容,避免hosts大量重复内容。
- 更新DNS缓存,使新的内容能及时生效。
代码实现
新建modify-host.bat文件,内容如下:
modify-host.bat
@echo off
setlocal enabledelayedexpansion
:: Admin check
net session >nul 2>&1
if %errorLevel% neq 0 (
echo [ERROR] Please run as administrator!
pause
exit /b 1
)
:: Configuration
set HOST_FILE=%windir%\system32\drivers\etc\hosts
set BACKUP_FILE="%HOST_FILE%.bak"
:: Delete existing backup if present
if exist %BACKUP_FILE% (
echo [INFO] Removing existing backup...
del %BACKUP_FILE% >nul 2>&1
if %errorLevel% neq 0 (
echo [ERROR] Failed to remove old backup
exit /b 1
)
echo [OK] Old backup removed
)
:: Create new backup
echo [INFO] Creating new backup...
copy "%HOST_FILE%" %BACKUP_FILE% >nul 2>&1
if %errorLevel% neq 0 (
echo [ERROR] Backup failed
exit /b 1
)
echo [OK] Backup created: %BACKUP_FILE%
:: Permission handling
icacls "%HOST_FILE%" | find "Everyone" >nul
if %errorLevel% neq 0 (
echo [INFO] Configuring write permissions...
icacls "%HOST_FILE%" /grant Everyone:F >nul || (
echo [ERROR] Permission configuration failed
exit /b 1
)
)
:: Entry management
set "ENTRIES=127.0.0.1 example.com 127.0.0.1 his.yx.com"
echo [INFO] Modifying hosts file...
set count=0
for %%i in (%ENTRIES%) do (
set /a count+=1
set /a mod=!count! %% 2
if !mod! equ 1 (
set ip=%%i
) else (
find /i "!ip! %%i" "%HOST_FILE%" >nul && (
echo [EXISTS] !ip! %%i
) || (
>> "%HOST_FILE%" echo !ip! %%i
echo [ADDED] !ip! %%i
)
)
)
:: Clear cache
ipconfig /flushdns >nul
echo [SUCCESS] Hosts modification complete!
pause
语法详解
系统指令
@echo off
: 关闭命令回显,让脚本运行时不显示每条命令setlocal enabledelayedexpansion
: 启用延迟变量扩展,允许在循环中动态修改变量值net session
: 尝试列出网络会话,只有管理员才能执行exit /b
1: 以错误码1退出脚本%windir%
: Windows系统环境变量,指向Windows目录ipconfig /flushdns
: 清空DNS解析缓存pause
: 暂停脚本,等待用户按键
变量扩展
%变量名%
: 立即扩展,获取静态的变量值!变量名!
: 延迟扩展,获取实时的变量值(需要enabledelayedexpansion)
set HOST_FILE=%windir%\system32\drivers\etc\hosts
设置静态变量HOST_FILE,变量值为hosts物理地址
条件语句
if 条件 (
命令1
) else (
命令2
)
循环语句
for %%变量 in (列表) do (
命令
)
错误处理
%errorLevel%
: 获取上一条命令的返回码,0表示成功>nul 2>&1
: 重定向输出和错误到空设备,隐藏输出和错误信息
算术运算
- set /a 变量=表达式
set /a:启用算术运算
set 变量=变量值
:以%变量%
的方式访问变量neq
: 不等于比较操作符equ
: 等于比较操作符|| 和 &&
: 条件执行操作符
文件操作
if exist
: 检查文件是否存在del
: 删除文件命令copy
: 复制文件命令icacls
: Windows文件权限管理工具>>
: 追加重定向,将内容添加到文件末尾find /i
: 不区分大小写搜索find "Everyone"
: 在输出中查找"Everyone"字符串/grant Everyone:F
: 授予Everyone用户组完全控制权限