5

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

4

3 回答 3

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

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

于 2013-05-27T12:43:10.130 回答
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 功能。(第一种方法是最快最简单的)

但希望我在这里的笔记能让你朝着正确的方向开始。

如果我以后有时间(我记得......)我会回来看看我是否可以进一步改进。

于 2013-05-27T13:04:25.577 回答
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 匹配的问题。

于 2013-05-27T14:40:11.327 回答