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

问题描述 投票:0回答:1

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

我试过这个:

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

但是主机中的结果只有一行,如下所示:

0.0.0.0 %a

我也想知道是否可以改变这个:

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

使用另一个代码来获取txt文件中的变量。

batch-file append add hosts-file
1个回答
1
投票

你的代码并不像Mofi所暗示的那么糟糕。尽管使用等号作为for循环的分隔符非常罕见,但它仍然是合法的语法。我看到的最大的两个问题是你在for声明结束时关闭你的findstr循环;并且,假设您解决了这个问题,%ERRORLEVEL%将需要延迟扩展。或者您可以使用if errorlevel语句的if语法(有关完整详细信息,请参阅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%"
© www.soinside.com 2019 - 2024. All rights reserved.