windows修改hosts批处理脚本

windows中hosts文件位于C:\Windows\system32\drivers\etc下。

我们可以手动修改hosts文件,但是对于多台PC而言,每台手动修改过于麻烦,故而本文旨在便捷脚本修改hosts文件。

设计思路

  1. 管理员权限执行脚本,大多数电脑的hosts都是受保护的,普通权限无法修改,故而需要管理员权限执行。
  2. 备份原有的hosts,避免修改错了无法还原。
  3. 修改hosts的读写权限,不分电脑的hosts仅有只读权限,不允许修改,如果不修改权限的话,无法覆写成功。
  4. 追加IP 域名,如果当前ip 域名已经存在则跳过,仅添加未存在的内容,避免hosts大量重复内容。
  5. 更新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用户组完全控制权限
相关推荐
埃博拉酱2 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
唐宋元明清21882 天前
.NET 本地Db数据库-技术方案选型
windows·c#
加号32 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
tryCbest2 天前
Windows环境下配置pip镜像源
windows·pip
呉師傅2 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
百事牛科技2 天前
保护文档安全:PDF限制功能详解与实操
windows·pdf
一个人旅程~2 天前
如何用命令行把win10/win11设置为长期暂停更新?
linux·windows·经验分享·电脑
一个假的前端男3 天前
[特殊字符] Flutter 安装完整指南 Windows—— 2026最新版
windows·flutter
倚肆3 天前
在 Windows Docker 中安装并配置 Nginx (映射 Windows 端口与路径)
windows·nginx·docker
破无差3 天前
拯救你的C盘
windows