Замедление работы пакетного файла из-за ошибок чтения

#batch-file

#пакетный файл

Вопрос:

В случае batch, если вы получаете сообщение об ошибке, максимум, что вы видите, это текстовое сообщение, а затем программа завершается. Есть ли способ замедлить его? или чтобы он останавливался перед закрытием при обнаружении ошибки?

Спасибо

Ответ №1:

Если вы запускаете пакетный файл из командной строки в окне MS-DOS и возникает ошибка, вы можете просто просмотреть текст в окне, чтобы увидеть, что произошло.

С другой стороны, если вы запускаете пакетный файл с помощью двойного щелчка в проводнике, вы ничего не увидите, если в пакетном файле есть ошибка. Это ваш случай? Если это так, то самое простое решение — протестировать пакетный файл в окне MS-DOS, пока он не заработает нормально.

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

  • Щелкните правой кнопкой мыши на вашем пакетном файле и выберите Создать сокращенный файл, сокращенный файл будет создан.
  • Щелкните правой кнопкой мыши на ярлыке и выберите Свойства
  • В Target после «C:Pathfilename.bat » добавить строку: amp; ПРИОСТАНОВИТЬ
  • Выберите OK

Таким образом, когда вы запускаете ярлык с помощью двойного щелчка, окно DOS будет выполнять ПАУЗУ после завершения работы пакетного файла по любой причине.

Комментарии:

1. Это хороший момент. Запуск его через окно MS-DOS будет похож на вызов файла Bat. Спасибо!

2. @GarethJones: Извините меня. Если вы считаете мой ответ полезным, могу я попросить вас проголосовать за? Спасибо! Кстати, вы видели мой ответ на ваш вопрос «таймер на 5 секунд в set / p»? Я думаю, что мой ответ может значительно обогатить вашу пакетную игру!

3. Я пытался, но из-за того, что беспроводная связь в моей части дома настолько отстой, она вернулась с ошибкой. Также я видел ваш ответ, спасибо, это было большим подспорьем, так как я не знал о том, что подобные внешние программы доступны для пакетной обработки

4. Это было очень полезно, пакетный файл работал при запуске из командной строки, но не при нажатии (из-за относительного пути)

5. Это не совсем полезный ответ. Некоторые пакетные скрипты запускают другой cmd.exe , что означает, что все это не имеет отношения к делу.

Ответ №2:

Перенаправьте вывод с помощью >, чтобы записать его в файл.

Вам может потребоваться: команда> файл 2> amp; 1

Комментарии:

1. Почему бы вам не попробовать и не посмотреть?

2. В интересах других, кто находит этот пост: второе предложение будет включать сообщения об ошибках в выходной файл в Windows 7 (и я предполагаю, что старше). Если вы оставите часть 2> amp; 1, ошибки перейдут на консоль, что также может быть полезно.

Ответ №3:

попробуйте это :

 if NOT ["%errorlevel%"]==["0"] (
    pause
    exit /b %errorlevel%
)
 

Комментарии:

1. Это работает! Я думаю, это должен быть принятый ответ.

Ответ №4:

Запустите скрипт из настоящего CMD.exe и добавьте «exit /b 1» в конец скрипта файла. Удалите любой простой «выход».

Комментарии:

1. exit /b 1 означает «завершите работу этого пакетного скрипта с кодом ошибки 1 «. Это не означает «выйти из этого пакетного сценария только в том случае, если был установлен код ошибки», о чем и задается вопрос.

Ответ №5:

Откройте новое окно cmd и выполните там свою команду. Вновь открытое окно не будет закрыто при возникновении ошибки.

 start cmd /k [command]
 

Это работает для меня с базовыми командами. Не уверен, что это полезно для чего-то более продвинутого.

Комментарии:

1. вы также можете передавать команды, подобные этой: start cmd /k "command 1 amp; command 2 amp; command 3"

Ответ №6:

Чтобы остановить пакетный скрипт до его завершения, поместите pause команду в новую строку, которая заставит скрипт ждать ввода пользователя (например, клавиши enter), прежде чем продолжить (или закрыть).

Комментарии:

1. Это не сработает, потому что, если в пакетном файле появится ошибка, он завершится сбоем, и поэтому не будет ни конца скрипта, ни каких-либо пауз.

Ответ №7:

на секунду

 PING -n 2 127.0.0.1 > NUL 2>amp;1
 

или на 10 секунд

 timeout /t 10 /nobreak
 

Ответ №8:

Это работает для меня. Аналогично ответу @ Sri7, но вам нужны скобки и кавычки:

 if NOT ERRORLEVEL 0 (
   pause
)