2009-07-22 4 views
50

В настоящее время я пишу свой первый командный файл для развертывания решения asp.net. Я немного искал Google для общего подхода к обработке ошибок и не нашел ничего полезного.Пакетные файлы - Обработка ошибок

В принципе, если что-то пойдет не так, я хочу остановиться и распечатать, что пошло не так.

Может ли кто-нибудь дать мне какие-нибудь указатели?

ответ

7

За исключением ERRORLEVEL, командные файлы не имеют обработки ошибок. Вы хотите посмотреть на более мощный язык сценариев. Я двигаю код до PowerShell.

Способность легко использовать сборки и методы .Net была одной из основных причин, которые я начал с PowerShell. Улучшенная обработка ошибок была другой. Тот факт, что Microsoft теперь требует, чтобы все серверные программы (Exchange, SQL Server и т. Д.) Были управляемыми PowerShell, были чистыми глазурью на торте.

Прямо сейчас, похоже, что любое время, потраченное на обучение и использование PowerShell, будет потрачено достаточно времени.

+3

Да, если бы я сделал это с помощью силовой оболочки, есть рубящий взлом, сценарий партии не успевает потратить время. – bplus

+1

Без сомнения, PowerShell - превосходный язык. Но ERRORLEVEL - это не единственный ресурс для партии - см. [Мой ответ] (http://stackoverflow.com/a/17085933/1012053). – dbenham

53

Обычно я нахожу условные команды конкатенации гораздо удобнее, чем ERRORLEVEL.

yourCommand && (
    echo yourCommand was successful 
) || (
    echo yourCommand failed 
) 

Существует одно осложнение, о котором вы должны знать. Ветвь ошибки будет срабатывать, если последняя команда в ветке успеха вызывает ошибку.

yourCommand && (
    someCommandThatMayFail 
) || (
    echo This will fire if yourCommand or someCommandThatMayFail raises an error 
) 

Исправление состоит в том, чтобы вставить безопасную команду, которая, как гарантируется, будет успешной в конце ветви успеха. Мне нравится использовать (call), который не делает ничего, кроме установки ERRORLEVEL 0. Существует следствие (call), что не делает ничего, кроме установленного ERRORLEVEL 1.

yourCommand && (
    someCommandThatMayFail 
    (call) 
) || (
    echo This can only fire if yourCommand raises an error 
) 

См Foolproof way to check for nonzero (error) return code in windows batch file примеров тонкостей необходимо при использовании ERRORLEVEL в обнаруживать ошибки.

+0

Не могли бы вы представить простой пример с командами копирования или del, pls? –

+0

Намного приятнее, чем отслеживать 'ERRORLEVEL', спасибо! – kaveman

+0

Я попробовал его с del, но он всегда выводит, что он был успешным, хотя файл не был там. – Xerus

3

Успешный пинг в вашей локальной сети может быть захвачен с помощью ERRORLEVEL.

@ECHO OFF 
PING 10.0.0.123 
IF ERRORLEVEL 1 GOTO NOT-THERE 
ECHO IP ADDRESS EXISTS 
PAUSE 
EXIT 
:NOT-THERE 
ECHO IP ADDRESS NOT NOT EXIST 
PAUSE 
EXIT 
4

Использование ERRORLEVEL, когда оно доступно, является самым простым вариантом. Однако, если вы вызываете внешнюю программу для выполнения какой-либо задачи, и она не возвращает правильные коды, вы можете вывести вывод на «find» и проверить этот уровень ошибок.

c:\mypath\myexe.exe | find "ERROR" >nul2>nul 
if not ERRORLEVEL 1 (
echo. Uh oh, something bad happened 
exit /b 1 
) 

Или дать больше информации о том, что произошло

c:\mypath\myexe.exe 2&1> myexe.log 
find "Invalid File" "myexe.log" >nul2>nul && echo.Invalid File error in Myexe.exe && exit /b 1 
find "Error 0x12345678" "myexe.log" >nul2>nul && echo.Myexe.exe was unable to contact server x && exit /b 1 
0

Я думаю, эта функция была добавлена ​​с OP, но и для будущих справочных ошибок, которые будут выводиться в окне командной строки могут быть перенаправлены в файл независимого стандартного вывода

команды 1> файл - Ввод стандартного вывода команды в файл

команда 2> файл - напишите стандартную ошибку Comman d к файлу

-4

Его предельно просто! Создать файл, содержащий:

call <filename> // the file you made 
cls 
echo An error occured! 
<Your commands> 
pause 

Так что теперь, когда вы начинаете его, он начнет свою программу в обычном режиме. Но когда что-то пойдет не так, он выходит и продолжает сценарий внутри первого файла. Теперь вы можете поместить свои собственные команды в

+0

Где ошибка обнаружения здесь? –

0

Python UnitTest, Bat Коды ошибки процесса:.

if __name__ == "__main__": 
    test_suite = unittest.TestSuite() 
    test_suite.addTest(RunTestCases("test_aggregationCount_001")) 
    runner = unittest.TextTestRunner() 
    result = runner.run(test_suite) 
    # result = unittest.TextTestRunner().run(test_suite) 
    if result.wasSuccessful(): 
     print("############### Test Successful! ###############") 
     sys.exit(1) 
    else: 
     print("############### Test Failed! ###############") 
     sys.exit() 

бать коды:

@echo off 
for /l %%a in (1,1,2) do (
testcase_test.py && (
    echo Error found. Waiting here... 
    pause 
) || (
    echo This time of test is ok. 
) 
) 
Смежные вопросы