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 小时前
Windows WSL2 (Ubuntu) 搭建 ESP‑IDF 6.1 开发环境全过程演示
linux·windows·ubuntu·esp32·乐鑫科技·乐鑫eim·乐鑫代理商
打工仔折腾 AI5 小时前
FaceFusion本地换脸实战:Windows整合包、模型选择与遮罩调参记录
人工智能·windows·后端·python·深度学习·性能优化·ai agent 实战
小蜗牛狂飙记7 小时前
Windows 双击 Jar 包无反应,不用写 bat 脚本!Jarfix 一键修复(以 Struts2 扫描工具为例)
windows·struts·jar
坐看风云变幻8 小时前
Betaflight 开发环境搭建保姆级教程(Ubuntu / Windows+WSL / Docker 三方案 + 官方网址大全)
windows·ubuntu·docker·无人机·飞控·betaflight
IT技术分享社区9 小时前
在 Windows 上跑未改动的 Linux 程序:微软 LiteBox v0.1 把这件事变简单了
linux·运维·windows·microsoft·开源
kakakahahahaha9 小时前
Win10/Win11 Windows Hello指纹不可用处理:WbioSrvc、传感器驱动与登录策略
windows·电脑·笔记本电脑·内容运营·软件需求
小黄人软件9 小时前
粘贴助手C++版 支持 Windows 7 / 10 / 11 不会出现缺少api-ms-win-core-path-11-1-0.dll
开发语言·c++·windows
Vex2une18 小时前
Windows 性能监视器发展史:从 PerfMon 计数器到 XPerf 深度诊断
windows·wpa·etw·性能监视器·perfmon·性能计数器·xperf
在角落发呆18 小时前
工具配置备份步骤:从手动备份到自动化方案
运维·windows·自动化
Vd7H20A719 小时前
Windows 下用 llama.cpp 运行 Qwen3.8-27B 并开启 512K 上下文 完全指南
windows·llama