как добавить новые строки в хосты Windows с командным файлом - PullRequest
0 голосов
/ 12 апреля 2019

я знаю, что это уже обсуждалось, но я не нашел то, что мне нужно.Мне нужно добавить новые строки в конце файла окна хостов, но сначала мне нужно проверить, существуют ли эти строки, и затем добавить их.

Я пробовал это:

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"

с другим кодом, который будет принимать переменные изтекстовый файл.

1 Ответ

1 голос
/ 13 апреля 2019

Ваш код не так плох, как мог бы предположить Мофи. Хотя использование знака равенства в качестве разделителя для цикла for довольно редко, тем не менее это допустимый синтаксис. Самые большие две проблемы, которые я вижу, заключаются в том, что вы закрываете свой цикл for в конце своего оператора findstr; и, если вы исправите это, %ERRORLEVEL% потребуется его расширение с задержкой. Или вы можете использовать синтаксис if errorlevel оператора if (см. help if в консоли cmd для полной информации). Или, что еще лучше, используйте условное исполнение.

Вот пример использования условного выполнения. В этом примере также открывается файл HOSTS для добавления один раз, а не один раз для каждой итерации цикла - небольшое повышение эффективности, правда, но полезная привычка для практики при записи файлов с циклом. И поскольку HOSTS по умолчанию имеет атрибуты, установленные для предотвращения записи, я сохранил и удалил атрибуты «только для чтения» / system / hidden / etc файла 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%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...