如何使用批处理文件向Windows主机添加新行

时间:2019-04-12 13:47:10

标签: batch-file append add hosts-file

我知道已经讨论过了,但是没有找到我需要的东西。 我需要在主机窗口文件的末尾添加新行,但是, 首先,我需要检查这些行是否已经存在,然后添加它们。

我尝试过:

set "list=examp.com=examp2.com=examp3.com"
SET NEWLINE=^0.0.0.0
for %%a in (%list%) do  (
   FINDSTR /I %%a %WINDIR%\system32\drivers\etc\hosts)
   IF %ERRORLEVEL% NEQ 0 (ECHO %NEWLINE% %%a>>%WINDIR%\System32\drivers\etc\hosts)
   pause

但是主机中的结果只有1行:

0.0.0.0 %a

我还想知道是否可以更改此设置:

set "list=examp.com=examp2.com=examp3.com"

带有另一个将从txt文件中获取变量的代码。

1 个答案:

答案 0 :(得分:1)

您的代码并不像Mofi所建议的那样糟糕。虽然在for循环中使用等号作为分隔符是很不常见的,但它仍然是合法的语法。我看到的最大的两个问题是,您正在for语句的结尾关闭findstr循环;并且假设您已解决此问题,%ERRORLEVEL%将需要延迟其扩展。或者,您可以使用if errorlevel语句的if语法(有关详细信息,请参阅cmd控制台中的help if)。甚至更好,请使用条件执行。

这是一个使用条件执行的示例。此示例还打开了您的HOSTS文件,每次循环只附加一次,而不是一次-确实提高了微妙的效率,但是在编写带有循环的文件时值得练习。并且由于默认情况下HOSTS的属性设置为禁止写入,因此我存储并删除了主机文件的只读/ system / hidden / etc。属性,将更改附加到文件中,然后将属性恢复为以前的样子

@echo off & setlocal

set "hosts=%WINDIR%\system32\drivers\etc\hosts"
set "list=examp.com=examp2.com=examp3.com"
SET "NEWLINE=0.0.0.0"

for /f "delims=" %%I in ('attrib "%hosts%"') do set "raw=%%~I"
setlocal enabledelayedexpansion
for /L %%I in (0,1,18) do if not "!raw:~%%I,1!"==" " set "attrs=!attrs!+!raw:~%%I,1! "
endlocal & set "attrs=%attrs%"

attrib -h -s -r -o -i -x -p -u "%hosts%"

>>"%hosts%" (
    for %%a in (%list%) do (
        >NUL 2>NUL find /I "%%a" "%hosts%" || echo(%NEWLINE% %%a
    )
)

attrib %attrs% "%hosts%"