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用户组完全控制权限
相关推荐
线上放牧人13 小时前
Windows删除图标缓存
windows·python·pyqt
Koi慢热13 小时前
DayDayMap学术社区体验:卫星网络测绘专题用下来怎么样
网络·人工智能·windows·web安全·网络安全
web守墓人14 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
2601_9623649718 小时前
红外活体模组,Windows 设备安全身份入口解析
windows·安全·电脑
易点云徐源19 小时前
(已解决)Photoshop 2020 点击“选择主体”闪退:不用重装,1 个配置切回旧算法解决
windows·photoshop
云计算练习生19 小时前
什么是系统调用?为什么程序访问硬件必须经过它
linux·windows·操作系统·系统调用·操作系统原理
其实防守也摸鱼1 天前
DeepSeek Harness 开源贡献手记:从入门到合入主线
服务器·数据库·windows·https·ssl
qqww1551 天前
Win11更新后Edge卡顿掉帧?隐私窗口流畅解决办法
windows·edge·优化·卡顿
其实防守也摸鱼1 天前
堆叠注入(Stacked Injection)详解
服务器·数据库·windows·https·ssl
郝学胜-神的一滴1 天前
C++20模板元编程 05:吃透变参模板,解锁编译期万能参数能力
服务器·开发语言·c++·windows·vscode