2014-11-14 56 views
0

我写了一个bat脚本,它将一行添加到hosts文件中。但是我也想删除已经有相同地址的任何行。例如:通过BAT脚本从主机文件中删除行

加线 192.168.1.1 wwww.google.com

我要检查,如果已经有与www.google.com一条线,将其删除。

有人可以解释如何做到这一点吗?

我的.bat添加一行。我需要编辑它以首先删除一行然后添加这一行。

@ECHO off 
ECHO. >> %WinDir%\System32\drivers\etc\hosts 
FINDSTR /V "217.168.173.1" "%WinDir%\system32\drivers\etc\hosts" 
ECHO 123.456.7.1 www.google.com >> %WinDir%\system32\drivers\etc\hosts 
EXIT 
+0

解决了!我设法解决我的问题,通过遵循[this](http://stackoverflow.com/questions/3666740/windows-batch-how-to-add-host-entries)回答@Rashy的意见并编辑我的要求 – 2014-11-14 14:53:41

回答

0

使用findstr.exe滤除线(/V)。

FINDSTR /V "192.168.1.1" "%HOSTS%" 

这将输出%HOSTS%的内容,而不包含任何包含192.168.1.1的行。这不会告诉你你想要过滤的行是否在文件中,但会给你一个没有这个地址的文件。之后,您可以随时将地址添加到文件的末尾(例如ECHO 192.168.1.1 www.google.com >>%HOSTS%),并确保它不在那里。

UPDATE

你的工作正在进行中的修改:

@ECHO off 
SETLOCAL 
SET "HOSTS=%WinDir%\System32\drivers\etc\hosts" 
SET "TEMP_HOSTS=%TEMP%\%RANDOM%__hosts" 
FINDSTR /V "217.168.173.1" "%HOSTS%" > "%TEMP_HOSTS%" 
ECHO 123.456.7.1 www.google.com >> "%TEMP_HOSTS%" 
MOVE /Y "%TEMP_HOSTS%" "%HOSTS%" 
EXIT /B 

变化:

  • SETLOCAL防止影响调用CMD会话的环境变量的变化。
  • 将文件的位置保存到变量。
  • 将过滤命令(FINDSTR)的输出保存到临时文件(对临时文件进行所有更改)。
  • 用新创建的临时文件替换生产主机文件。
  • EXIT /B将退出脚本而不结束您的CMD会话(交互式运行 - 即测试/开发时)。
+0

这对我不起作用,因为我想创建一个.exe来编辑我的客户端的hosts文件。附加的作品,但我需要删除一个旧的重定向已经存在。 – 2014-11-14 13:46:53

+0

使用这种方法192.168.1.1行不会被删除,几个空行被添加到文件中,然后我的新行被添加。 – 2014-11-14 13:52:22

+0

此方法不会删除192.168.1.1行。它向主机文件添加了几个空行,然后添加我的新行 – 2014-11-14 13:53:34

0

使用拷贝而不是移动保留的访问权限

@ECHO off 
SETLOCAL 
SET "HOSTS=%WinDir%\System32\drivers\etc\hosts" 
SET "TEMP_HOSTS=%TEMP%\%RANDOM%__hosts" 
FINDSTR /V "217.168.173.1" "%HOSTS%" > "%TEMP_HOSTS%" 
ECHO 123.456.7.1 www.google.com >> "%TEMP_HOSTS%" 
COPY /b/v/y "%TEMP_HOSTS%" "%HOSTS%" 
EXIT /B