如何使用批处理文件向 windows 主机添加新行
how to add new lines to windows hosts with a batch file
我知道这已经讨论过了,但我没有找到我需要的东西。
我需要在主机 window 文件的末尾添加新行,但是,
首先我需要检查这些行是否已经存在然后添加它们。
我试过这个:
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 文件获取变量的代码。
您的代码并不像 Mofi 所建议的那样糟糕。尽管使用等号作为 for
循环的定界符并不常见,但它仍然是合法的语法。我看到的最大的两个问题是您在 findstr
语句的末尾关闭了 for
循环;并且,假设您修复了该问题,%ERRORLEVEL%
将需要延迟其扩展。或者您可以使用 if
语句的 if errorlevel
语法(有关完整详细信息,请参阅 cmd 控制台中的 help if
)。或者更好的是,使用条件执行。
这是一个使用条件执行的示例。此示例还打开您的 HOSTS 文件以追加一次,而不是每次循环迭代一次——这是一种微妙的效率改进,确实如此,但在使用循环编写文件时,这是一个值得练习的习惯。并且由于 HOSTS 默认设置了防止写入的属性,我存储并删除了 hosts 文件的只读/系统/隐藏/等属性,将更改附加到文件中,然后将属性恢复为之前的状态.
@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%"
我知道这已经讨论过了,但我没有找到我需要的东西。 我需要在主机 window 文件的末尾添加新行,但是, 首先我需要检查这些行是否已经存在然后添加它们。
我试过这个:
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 文件获取变量的代码。
您的代码并不像 Mofi 所建议的那样糟糕。尽管使用等号作为 for
循环的定界符并不常见,但它仍然是合法的语法。我看到的最大的两个问题是您在 findstr
语句的末尾关闭了 for
循环;并且,假设您修复了该问题,%ERRORLEVEL%
将需要延迟其扩展。或者您可以使用 if
语句的 if errorlevel
语法(有关完整详细信息,请参阅 cmd 控制台中的 help if
)。或者更好的是,使用条件执行。
这是一个使用条件执行的示例。此示例还打开您的 HOSTS 文件以追加一次,而不是每次循环迭代一次——这是一种微妙的效率改进,确实如此,但在使用循环编写文件时,这是一个值得练习的习惯。并且由于 HOSTS 默认设置了防止写入的属性,我存储并删除了 hosts 文件的只读/系统/隐藏/等属性,将更改附加到文件中,然后将属性恢复为之前的状态.
@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%"