Ответ 1
Я обнаружил, что "exit 0" выглядит как хороший способ справиться с этой проблемой.
Пример использования:
NET STOP UnderDevService/Y
выход 0
если служба UnderDevService не запущена.
У меня есть событие post-build, которое запускает некоторые команды для проекта С#. Последняя команда иногда приводила к тому, что значение ERRORLEVEL не равно нулю, а затем сбой сборки.
Я хочу добавить дополнительную строку команды, чтобы всегда устанавливать значение ERRORLEVEL в ноль. Каков наиболее удобный способ сделать это?
Я обнаружил, что "exit 0" выглядит как хороший способ справиться с этой проблемой.
Пример использования:
NET STOP UnderDevService/Y
выход 0
если служба UnderDevService не запущена.
если вы используете exit /b 0
, вы можете вернуть errorlevel 0
из дочернего пакета script, не выходя из родителя.
Кажется, делает трюк:
ver > nul
Не все работает, и непонятно почему. Например, следующее:
echo. > nul
cls > nul
В событии pre-or post-build, если код возврата исполняемого файла больше нуля, а вызов исполняемого файла не является последней строкой события pre-or post-build, быстрый способ отключения звука он и не запускать проверку для ненулевого errorlevel
означает следовать линии сбоя с линией, которая явно возвращает ноль:
cmd /c "exit /b 0"
Это, по существу, общая комбинация ранее упомянутых решений, которые будут работать не только с последней строкой события до или после сборки.
Я использую VERIFY
или VERIFY > nul
Я лично использую это:
cd.
Работает даже в unix-оболочке.
Но это может быть немного быстрее:
type nul>nul
Поскольку Process Monitor
отображает вызовы QueryDirectory
на cd.
PS: cd.
имеет еще один приятный побочный эффект в оболочке unix. Он восстанавливает восстановленный рабочий каталог в терминале, если он был открыт до удаления.
Если это фрагмент, например "Событие после сборки" и т.д., тогда вы будете хорошо добавлены:
(...) || ver > nul
в конце последней команды.
В качестве альтернативы
cmd /c "exit /b 0"
очень чистый и неидиоматический - читатель, который знает оболочку Windows, будет знать, что происходит, и каковы были ваши намерения.
Однако, если вы в пакете script, вы можете использовать субтроины, которые являются легким эквивалентом "дочерней партии script" из ответа akf.
Есть подпрограмма:
:reset_error
exit /b 0
а затем просто
call :reset_error
где вам это нужно.
Вот полный пример:
@echo off
rem *** main ***
call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%
call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%
call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%
:: this is needed at the end of the main body of the script
goto:eof
rem *** subroutines ***
:empty
goto:eof
:raise_error
exit /b 1
:reset_error
exit /b 0
Какие выходы:
After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0
Как вы видите - просто вызов и возврат через goto: eof недостаточно.
Добавьте >nul
после каждой команды, которая, вероятно, завершится неудачей - это, по-видимому, предотвратит сбои сборки.
Вы все еще можете проверить результат команды, исследуя %errorlevel%
.
Например:
findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)
Я использую это:
ping localhost -n 1 > null
Я всегда использовал;
set ERRORLEVEL=0
Я использую его для ослов.