Windows批处理添加记录到hosts文件

5

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


你的代码在哪里出了问题? - jeb
不错。我只是不知道如何检查记录是否已经存在。 - Tobia
3个回答

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

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


1
一个IP地址可能会有误匹配。这是不可靠的。记录也可能包含制表符,这使得比较更加复杂。 - foxidrive
啊嗯...是的...会考虑使用 FINDSTR 版本。 - npocmaka
1
@Tobia,如果您想要添加一个空行,可以使用以下命令:echo\>>"%SystemRoot%\system32\drivers\etc\hosts&&echo my_record>>"%SystemRoot%\system32\drivers\etc\hosts""。请注意Foxidrive提到的内容,并使用整个命令来查找记录。 - npocmaka
我将这个脚本添加到我的Inno Setup安装程序中(在Win7上工作),我确定这个安装程序以管理员身份运行,但仍然无法正常工作。如果我更改hosts文件的权限,它就可以再次工作。 - Tobia
@Tobia - 需要更改哪些文件权限?可以使用ATTRIBCACLS吗? - npocmaka
显示剩余5条评论

2

这有点棘手。

首先,我建议您放弃使用批处理文件来完成此操作。

仅凭批处理文件本身无法做任何类似的事情,除非与外部工具一起使用。

虽然这是可能的,但除非您知道需要安装哪些命令行工具以及如何搭配使用,否则您将不断进行尝试。

如果您确实想要这样做,那么我建议您查看sourceforge上的GnuWin32项目,他们已将所有标准unix命令行工具移植到windows系统中,其中包括sed、grep、awk等工具,非常适合您所需的操作。

然而,我强烈建议您考虑使用Powershell,或者如果您有.NET经验,则可以使用C#编写命令行工具。

我暂时想不出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功能。(第一种方法最快,也最简单)
希望我的注释能让您朝着正确的方向开始。如果我稍后有时间(并且我记得...),我会回来看看是否可以进一步改进。

我正在询问一个批处理文件...抱歉。 - Tobia

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匹配的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接