Пакетные файлы - обработка ошибок
В настоящее время я пишу свой первый командный файл для развертывания решения asp.net.
Я немного искал Google для общего подхода к обработке ошибок и не нашел ничего полезного.
В принципе, если что-то пойдет не так, я хочу остановиться и распечатать, что пошло не так.
Может ли кто-нибудь дать мне какие-нибудь указания?
Ответы
Ответ 1
Я обычно считаю, что операторы конкатенации условных команд гораздо удобнее, чем 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
)
См. Неверный способ проверить ненужный (ошибка) код возврата в пакетном файле Windows для примеров тонкостей, необходимых при использовании ERRORLEVEL для обнаружения ошибок.
Ответ 2
Помимо ERRORLEVEL, командные файлы не имеют обработки ошибок. Вы хотите посмотреть на более мощный язык сценариев. Я переводил код в PowerShell.
Возможность легко использовать сборки и методы .Net была одной из основных причин, которые я начал с PowerShell. Улучшенная обработка ошибок была другой. Тот факт, что Microsoft теперь требует, чтобы все серверные программы (Exchange, SQL Server и т.д.) Были управляемыми PowerShell, были чистыми глазурью на торте.
Прямо сейчас, похоже, что любое время, потраченное на обучение и использование PowerShell, будет потрачено достаточно времени.
Ответ 3
Использование 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
Ответ 4
Успешный пинг в локальной сети может быть захвачен с помощью 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
Ответ 5
Я предполагаю, что эта функция была добавлена, поскольку OP, но для будущих исходных ошибок, которые будут выводиться в командном окне, можно перенаправить в файл, не зависящий от стандартного вывода
command 1 > file - записать стандартный вывод команды в файл
command 2 > file - записать стандартную ошибку команды в файл
Ответ 6
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.
)
)
Ответ 7
Это очень легко!
Создайте файл, содержащий:
call <filename> // the file you made
cls
echo An error occured!
<Your commands>
pause
Итак, теперь, когда вы запустите его, он запустит вашу программу как обычно. Но когда что-то пойдет не так, он выходит и продолжает script внутри первого файла. Теперь вы можете ввести свои собственные команды.