我需要一个批处理文件来向 Windows 中的主机文件添加一条记录,但是我不需要只添加一个文件追加写入,因为我想检查这条记录是否已经存在。有可能吗?
3 回答
type "%SystemRoot%\system32\drivers\etc\hosts" | find "my_record" ||echo my_record>>"%SystemRoot%\system32\drivers\etc\hosts"
试试这个。您需要管理员权限才能在主机文件中添加内容
嗯,棘手的一个。
我要说的第一件事是忘记尝试使用批处理文件执行此操作。
除非与外部工具一起使用,否则仅批处理文件无法执行此类操作。
虽然这当然是可能的,除非您确切地知道需要安装哪些命令行工具,以及您最终将如何无休止地进行试验以找到一个好的组合。
但是,如果您确实想走这条路,那么我建议您查看 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 匹配的问题。