【发布时间】:2013-05-27 12:37:28
【问题描述】:
我需要一个批处理文件来将记录添加到 Windows 中的主机文件,但是我不需要仅文件追加写入,因为我想检查该记录是否已经存在。可以吗?
【问题讨论】:
-
你的代码哪里出错了?
-
不错。我只是不知道如何检查记录是否已经存在。
标签: batch-file hosts
我需要一个批处理文件来将记录添加到 Windows 中的主机文件,但是我不需要仅文件追加写入,因为我想检查该记录是否已经存在。可以吗?
【问题讨论】:
标签: batch-file hosts
type "%SystemRoot%\system32\drivers\etc\hosts" | find "my_record" ||echo my_record>>"%SystemRoot%\system32\drivers\etc\hosts"
试试这个。您需要管理员权限才能在 hosts 文件中添加内容
【讨论】:
FINDSTR的版本
echo\>>"%SystemRoot%\system32\drivers\etc\hosts&&echo my_record>>"%SystemRoot%\system32\drivers\etc\hosts""。记住 foxidrive 的提及并使用整行查找记录
嗯,这很棘手。
我要说的第一件事是忘记尝试使用批处理文件执行此操作。
除非与外部工具一起使用,否则仅批处理文件无法执行此类操作。
虽然这当然是可能的,但除非您确切知道需要安装哪些命令行工具,以及最终将如何无休止地试验以找到一个好的组合。
如果你确实想走这条路,那么我建议你看看 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 功能。 (第一种方法是最快最简单的)
希望我在这里的笔记能让你朝着正确的方向开始。
如果我以后有时间(我记得....)我会回来看看我是否可以进一步改进。
【讨论】:
基于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匹配的问题。
【讨论】: