УРОВЕНЬ ОШИБКИ команды FINDSTR, всегда возвращающей 0

#batch-file #cmd

#пакетный файл #cmd

Вопрос:

Я должен удалить запись в файле hosts на некоторых устройствах. FINDSTR Команда работает, но всегда возвращается errorlevel 0 .

Я знаю, что по умолчанию значение %errorlevel% всегда 0 равно. Таким образом , если предыдущая команда не устанавливает код ошибки , она всегда будет возвращаться 0 .

Мне в основном нужно найти строку в файле hosts, если она существует, она должна сохранить новый файл hosts без строки, содержащей строку.

Это то, что я делаю:

 set HOSTSFILE=%WINDIR%system32driversetchosts
set TEMP_HOSTS=%TEMP%%RANDOM%__hosts

FINDSTR /V /I /C:"string to search for" "%HOSTSFILE%" > "%TEMP_HOSTS%"
IF %ERRORLEVEL% EQU 0 COPY /b/v/y "%TEMP_HOSTS%" "%HOSTSFILE%"
 

В принципе это работает. Однако приведенный выше код всегда будет возвращаться errorlevel 0 и, следовательно, всегда копировать файл hosts, даже если строка отсутствует в файле.

Я знаю, что на самом деле это не имеет значения, но мне любопытно, почему errorlevel здесь не работает?
Значение errorlevel должно быть установлено предыдущей командой, которая в данном случае является FINDSTR .

Я также пробовал использовать FIND команду и !errorlevel! вместо %errorlevel% .

Комментарии:

1.Это показывает, что ваше утверждение неверно. findstr /c:fonts c:windowswin.ini > "%userprofile%desktoptttt.txt" Echo %errorlevel% findstr /c:cat c:windowswin.ini > "%userprofile%desktoptttt.txt" Echo %errorlevel% pause

2. Извините, но все работает так, как задумано. findstr устанавливает errorlevel значение, когда он не находит ни одной строки, соответствующей указанным условиям. Вы запрашиваете все, кроме ( /v ) одной (или нескольких) строки (строк), поэтому, если внутри файла есть какая-либо другая строка findstr , она найдет ее, и errorlevel это будет 0 так, как есть строки, соответствующие условию.

3. Почему бы не создать резервную копию hosts вдоль текущей, а затем запустить Find против резервной копии, перенаправленной на текущую. Таким образом, у вас всегда будет резервная копия, независимо от того, были ли внесены изменения. CD /D "%__AppDir__%driversetc" amp;amp; (Copy /Y "hosts" "hosts.bak") amp;amp; (Find /I /V "string to search for"<"hosts.bak">"hosts") .