Windows Batch将记录添加到hosts文件

时间:2013-05-27 12:37:28

标签: batch-file hosts

我需要一个批处理文件来向Windows中的hosts文件添加记录,但是我不需要只是一个文件追加写入,因为我想检查这个记录是否已经存在。可能吗?

3 个答案:

答案 0 :(得分:9)

type "%SystemRoot%\system32\drivers\etc\hosts" | find "my_record" ||echo my_record>>"%SystemRoot%\system32\drivers\etc\hosts"

试试这个。您需要管理员权限才能在主机文件中添加内容

答案 1 :(得分:2)

嗯,这很狡猾。

我要说的第一件事是忘记尝试使用批处理文件执行此操作。

除非与外部工具一起使用,否则单独的批处理文件无法执行此类操作。

虽然这当然是可能的,除非您确切知道需要安装哪些命令行工具,以及如何最终尝试无休止地找到一个好的组合。

如果你确实想要走这条路,那么我建议你看看sourceforge上的GnuWin32项目,他们把所有标准的unix命令行工具移植到windows,其中包括Sed,Grep,awk还有更多适合你想要做的事情。

但是我强烈建议您使用Powershell,或者如果您在C#中有任何.NET经验的命令行工具,那就更好了。

我无法想到一个powershell示例,但你可以在C#中用以下内容来做:

using System;
using System.Collections.Generic;
using System.IO;

class Program
{
  static void Main()
  {
    const string filename = "path\to\your\hosts\file";

    List<string> lines = new List<string>();
    using (StreamReader reader = new StreamReader(filename))
    {
      string line;
      while ((line = reader.ReadLine()) != null)
      {
        lines.Add(line);
      }
    }

    string newLineToAdd = "127.0.0.1  somedomain.com"
    bool found = false;

    foreach(string line in lines)
    {
      if(line.Equals(newLineToAdd))
      {
        found = true;
      }
    }

    if(!found)
    {
      lines.Add(newLineToAdd);
    }

    using (StreamWriter writer = new StreamWriter(filename))
    {
      foreach(string line in lines())
      {
        writer.WriteLine(line);
      }
    }
  }
}

请注意,这不是一个完整的例子,我当然没有时间测试编译它,但理论上你需要做什么(无论你选择哪种语言)是:

1)将文件的所有行加载到数组中 2)扫描阵列中的每一行检查它是否等于你想要添加的行 3)如果数组中尚不存在,则将新行添加到数组中 4)将数组中的所有行写回磁盘,完全覆盖旧文件。

有关我的例子的一些注意事项:

1)我已经对所有内容进行了硬编码,你需要传递一些参数(不幸的是我现在还没有时间来输入全功能的样本)

2)修改主机文件必须具有管理员权限,因此您需要从标记为以管理员身份运行的快捷方式运行程序,或者您需要将.NET项目设置为编译并作为管理程序通过添加一些额外的代码来使用Windows中的UAC功能。 (第一种方法是最快捷,最容易的)

希望我的笔记能让你开始朝着正确的方向前进。

如果我以后有时间(我记得......),我会回来看看我是否可以改善一些事情。

答案 2 :(得分:1)

建议基于npocmaka的代码:

for /f "tokens=1*" %%i in ("%my_record%") do type "%SystemRoot%\system32\drivers\etc\hosts" | find "%%i" | find "%%j" >nul||echo %my_record%>>"%SystemRoot%\system32\drivers\etc\hosts"

这解决了错误的IP匹配问题。