Ваш код не так плох, как мог бы предположить Мофи. Хотя использование знака равенства в качестве разделителя для цикла 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%"