#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")
.