2009-07-11 2 views
50

У меня есть событие post-build, которое запускает некоторые команды для проекта C#. Последняя команда иногда приводила к тому, что значение ERRORLEVEL не равнялось нулю, а затем сборка не удалась.Каков самый простой способ сбросить ERRORLEVEL до нуля?

Я хочу добавить дополнительную команду, чтобы всегда устанавливать значение ERRORLEVEL в ноль. Каков наиболее удобный способ сделать это?

+0

Строить не действительно терпят неудачу, только IDE будет выглядеть как он. – Dykam

+8

Я понимаю, что это довольно старое сообщение ... У меня был успех в сбросе errorlevel на 0, выдав команду «type nul» после последней команды. Просто чувствовал, что это может быть полезно. – Arun

ответ

15

Я обнаружил, что «выход 0» выглядит как хороший способ справиться с этой проблемой.

Пример использования:

NET СТОП UnderDevService/Y

выход 0

если услуга UnderDevService не запускается.

+4

нет, если вы также хотите запустить этот командный файл из командной строки, так как exit 0 закроет окно. cmd/c «exit/b 0», как предлагается ниже, значительно более bening – madoki

42

Кажется, сделать трюк:

ver > nul 

Не все работает, и не понятно, почему. Например, следующие:

echo. > nul 
cls > nul 
+9

Я думаю, что причина того, почему «эхо» и «cls» не работает, - это то, что они являются встроенными командами оболочки, а не настоящими программами. – user95319

+1

Я дам вам это, но где ver.exe? –

+0

Я не могу найти «ver.exe» или «ver.com». Я не знаю, как это объяснить. – user95319

56

Если вы используете exit /b 0, вы можете вернуть errorlevel 0 из дочернего пакетного скрипта, не выходя из родителя.

+4

Из всех предлагаемых решений это, вероятно, будет лучшим. Я собираюсь бросить эту строку в сценарий * resetErrorlevel.bat *. В общем, тот факт, что нужно идти на такие длины, чтобы сделать что-то столь же тривиальным, как очистка уровня ошибок сценария, еще больше доказывает, что изобретателю пакетного программирования Windows следует охотиться и сурово наказывать. ;) – antred

23

В случае до или после сборки, если код возврата исполняемого файла больше нуля, а вызов исполняемого файла не является последней строкой события до или после сборки, быстрый способ отключить его и избежать запуска проверки на ненулевой errorlevel должны следовать за провальную линией с линией, которая явно возвращает ноль:

cmd /c "exit /b 0" 

Это, по сути, общая комбинация из ранее упомянутых решений, которые будут работать с более только Последняя строка события до или после сборки.

+0

спасибо, это сработало для меня. более легкое звучащее предложение «exit 0» выше не сокращает его, поскольку я хочу продолжать делать вещи после сброса уровня ошибок, а не выйти из – madoki

+3

еще более причудливо: вы можете использовать ' || cmd/c "exit/b 0" 'в качестве одного вкладыша. – Kupiakos

+0

Мне нравится этот метод для *** установки *** произвольного уровня ошибок, например: 'cmd/c" exit/b 9009 "', но кажется, что он слишком переполнен для установки на 0. Не будет 'ver> nul' (внутренняя команда), работают с меньшими затратами, чем загрузка другой копии командной оболочки с помощью 'cmd/c 'exit/b 0" '? –

0

Добавить >nul после каждой команды, которая может потерпеть неудачу - это, по-видимому, препятствует сбою сборки.

Вы все еще можете проверить результат выполнения команды, изучив %errorlevel%.

Например:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it) 
+1

Это не сработает - оболочка оценивает всю командную строку сразу, поэтому% errorlevel% будет заменен до того, как будет выполнена команда «findstr». Используйте «if errorlevel 1» вместо этого, чтобы проверить ненулевой уровень ошибок. – UweBaemayr

+1

Возможно, ваш CI-сервер выйдет из строя, если он, например, находит строку «ошибка» в стандартной выходной/стандартной ошибке. Вы не сбрасываете статус. Вы просто замалчиваете команду. Для более глубокого молчания используйте> nul 2> nul –

-3

Я всегда просто использовал;

set ERRORLEVEL=0 

Я использую его для лет осла.

+22

Это легко, но это очень плохая идея, так как это создает переменную с именем 'errorlevel', которая накладывает внутреннюю псевдо-переменную' errorlevel' – jeb

+4

Crikey, вы правы! Ничего себе, похоже, что я уклонялся от пуль в течение многих лет :) – cirrus

+1

То же самое здесь Cirrus! спасибо, jeb! – PsychoData

0

Я использую это:

пинг локальный -n 1> нулевой

+2

Также популярна как команда sleep, когда n> 1. –

1

Если это фрагмент как «после построения Event» и т.д., то вы будете в порядке:

(...) || ver > nul 

в конце последней команды.

Альтернативно

cmd /c "exit /b 0" 

очень чистый и не идиоматическое - читатель, который знает Windows, оболочка будет знать, что происходит, и то, что было ваше намерение.

Однако, если вы используете пакетный скрипт, вы можете использовать субтроины, которые являются легким эквивалентом «детского пакетного сценария» из ответа 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: ВФ не достаточно.

1

Я лично использую это:

cd .

Работает даже в Unix оболочки.

Но это один может быть немного быстрее:

type nul>nul

Поскольку Process Monitor показывает QueryDirectory звонки на cd .

Смежные вопросы