Подтвердить что ты не робот

Пакетные файлы - обработка ошибок

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

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

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

4b9b3361

Ответ 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 внутри первого файла. Теперь вы можете ввести свои собственные команды.