从主持人

时间:2017-12-26 01:18:29

标签: batch-file

我需要从批处理文件中的主机文件中删除2行:

www.domain1.com
www.domain2.com

所以我写了这段代码,但有一些问题:

@Echo Off
Set hosts=%WinDir%\System32\Drivers\etc\hosts
Attrib -R %hosts%

FindStr /V /I /C:"www.domain1.com" "%hosts%" > "d:\1.txt"
FindStr /V /I /C:"www.domain2.com" "d:\1.txt" > "d:\2.txt"

这项工作和d:\ 2.txt是按照我想要的方式制作的,所以现在我必须删除1.txt并替换/移动2.txt到主机 我有一些问题要更新并使我的代码更简单:

我可以将上面的2条FindStr线合并为1行,而不需要制作第3个文件吗? 我不知道为什么例如这个不起作用,而它应该有效?

FindStr /V /I /C:"www.domain1.com" "%hosts%" > "%hosts%"

这会使整个文件变空! 请告知,不要使用查找:)

1 个答案:

答案 0 :(得分:1)

hosts文件的www.r2rdownload.com文件的所有行中搜索不区分大小写字面的完整命令行,用于www.elephantafiles.com或{{1}并输出所有不包含这两个字符串之一的行:

%SystemRoot%\System32\findstr.exe /I /L /V "www.r2rdownload.com www.elephantafiles.com" "%SystemRoot%\System32\drivers\etc\hosts"

选项/L很重要,否则由空格分隔的两个字符串将被解释为正则表达式字符串,.被解释为除换行符之外的任何字符的占位符。

完全相同的查找结果的另一种可能性是:

%SystemRoot%\System32\findstr.exe /I /V /C:"www.r2rdownload.com" /C:"www.elephantafiles.com" "%SystemRoot%\System32\drivers\etc\hosts"

命令行在文件中的任何地方另外找到空行,因此不输出这些行:

%SystemRoot%\System32\findstr.exe /I /R /V "www\.r2rdownload\.com www\.elephantafiles\.com ^$" "%SystemRoot%\System32\drivers\etc\hosts"

在这种情况下,所有三个空格分隔的字符串都是正则表达式字符串,这是转义.并将反斜杠字符解释为文字字符的原因。

整个批处理文件可以是例如:

@echo off
set "HostsFile=%SystemRoot%\System32\drivers\etc\hosts"
%SystemRoot%\System32\attrib.exe -r "%HostsFile%"
%SystemRoot%\System32\findstr.exe /I /R /V "www\.r2rdownload\.com www\.elephantafiles\.com ^$" "%HostsFile%" >"%TEMP%\%~n0.tmp"
move /Y "%TEMP%\%~n0.tmp" "%HostsFile%"
if errorlevel 1 del "%TEMP%\%~n0.tmp"
set "HostsFile="

必须使用管理员的提升权限执行此批处理文件。