用批处理修改hosts文件

最近加入了微软社区精英计划,希望为社区出份力。过去没写过博客,就把n年以前在论坛里发的帖子翻了出来。整理一下作为博客文章吧。

当年有个同学问到:需要为用户增加一条hosts记录,如何用脚本解决这个问题。
显然,最简单的做法是:

  1. echo 192.168.2.2 www.domainname.com >> %SystemRoot%\system32\drivers\etc\hosts

也就是将 192.168.2.2 www.domainname.com 添加到hosts文件结尾处。
这无疑带来一个问题,多次运行这个脚本,会在hosts文件中加入许多无用的垃圾。我们需要加入一个判断,检查一下记录是否已经存在。

  1. @echo off
  2. set stHosts=X.X.X.X www.domainname.com
  3. FOR /F “eol=# tokens=1 delims=” %%i in (%SystemRoot%\system32\drivers\etc\hosts) do if “%stHosts%”==“%%i” exit
  4. echo %stHosts%>> %SystemRoot%\system32\drivers\etc\hosts

set命令比较好理解,定义了一个变量,也就是我们要插入的记录,最后不要留空格。
解释一下这条For命令:
 FOR /F “eol=# tokens=1 delims=” %%i in (%SystemRoot%\system32\drivers\etc\hosts) do
For /F 命令会读取hosts文件,将其分成一行行的文字,根据我们指定的规则进行拆分处理,“eol=#” 忽略过#开头的行,“tokens=1”传送每行第一个符号,“delims=”将分隔符集设为空(默认为空格和跳格键),其实是将整行记录返回,并赋值 给%%i,然后执行do 后面的命令。

for命令功能十分强大,可以轻易完成许多看似不可能用批处理完成的任务。在命令行下键入 for /? 可以得到完整的帮助说明还有例子。

由此我们可以得到hosts文件中的每条记录,接下来用if来判别一下,看看这条记录是否为我们要添加的记录。如果是的话表示记录已经添加,可以直接退出脚本,什么也不做。 if语句中 == 两边的变量都加了””是为了防止变量为空的情况。

最后一行添加记录到hosts结尾。

使用此脚本,需要在组策略中设为计算器启动脚本。注意一定要使启动脚本,用户登录脚本会因为权限问题无法运行,许多初学者会卡在这里。
设置的位置在: Group Policy Object Editor -> Computer Configuration -> Windows settings -> Scripts(Startup/Shutdown)

 

来自:http://huangchao2005.blog.51cto.com/1249888/289187

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *