我需要一个批处理文件来向Windows中的hosts文件添加记录,但是我不需要只是一个文件追加写入,因为我想检查这个记录是否已经存在。可能吗?
答案 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匹配问题。