Частью установки приложения, за которое я отвечаю, является компиляция некоторых библиотек кода C. Это делается в консоли с помощью GNU Make.
Итак, как часть установки, открывается окно консоли, вы видите мастер вывода файла make по мере его компиляции и связывания, по завершении окно консоли закрывается, и программа установки продолжает работу.
Все хорошо, если только нет ошибки компиляции. Затем make-файл выдает ошибку, и окно консоли закрывается, прежде чем у вас появится возможность выяснить, что происходит.
Итак, я бы хотел, чтобы окно консоли приостанавливалось с функциональностью типа «нажмите клавишу, чтобы продолжить», если есть ошибка из make-файла, чтобы консоль оставалась открытой. В противном случае просто выйдите как обычно и закройте консоль.
Я не могу понять, как это сделать в файле Makefile GNU или из командного файла, который мог бы запускать Make.





это должно сработать:
if not ERRORLEVEL 0 pause
введите help if в DOS для получения дополнительной информации об использовании уровня ошибок.
Я не вижу в этом проблемы. errorlevel определяется разработчиком программы как код выхода приложения, и он указывает на ошибку, если он не равен 0. Если по какой-либо причине разработчик выбрал выход с кодом 2 или 7, мое условие будет оцениваться как истинное, в то время как «если ERRORLEVEL 1 "будет оцениваться как ложное.
Извините, вы в порядке, просто я использую .bat для запуска службы, и, очевидно, если вы закроете ее с помощью Ctrl + C, она выйдет с ERRORLEVEL 130, и я не хотел, чтобы окно оставалось открытым на тот случай.
это не работает. Я попытался использовать команду копирования (вместо копирования), но она не останавливается. if ERRORLEVEL 1 пауза работает.
Это решение не работает с файлами Batch / CMD. ERRORLEVEL 0 относится к ERRORLEVEL => 0. Это всегда будет истинный, кроме ERRORLEVEL = -1. Применение NOT просто инвертирует его. Следовательно, за исключением ERRORLEVEL = -1, приведенный выше код всегда будет ложный. Пожалуйста, прочтите: ss64.com/nt/if.html
@bryc то, что вы написали, кажется очень разумным. однако я отчетливо помню, как тестировал это в Windows (7?) и сравнивал его с альтернативой if ERRORLEVEL 1 pause внутри файла .bat. по крайней мере, в моих сценариях я получил ложный ответ от альтернативы. Попробую воспроизвести, когда найду машину с windows
Вы пробовали команду паузы?
@echo off
echo hello world
pause
Это то, что вы ищете:
if ERRORLEVEL 1 pause
Если вы напечатаете
HELP IF
вы получите эту информацию: номер ERRORLEVEL | Задает истинное условие, если последний запуск программы возвратил код выхода равно или больше чем указанное число.
Использование этой простой программы на C для управления кодом выхода:
#include <stdio.h>
main(int argc, char *argv[]) {
if (argc == 2) {
// return integer of argument 1
return strtol(argv[1], NULL, 10);
}
else {
return 0;
}
}
Мы можем протестировать код выхода в командный файл следующим образом:
test.exe 0
IF ERRORLEVEL 0 PAUSE
Условие: 0 => 0 == TRUE
Когда ERRORLEVEL = 0, пауза возникает, потому что логика - >= или больше или равно. Это важно, поскольку не сразу понятно, не является ли данное условие сравнением с ==.
Обратите внимание, что замена на 1 => 0 также будет верной, и, следовательно, также произойдет пауза. Это верно для любого положительного числа.
Обратный эффект можно вызвать, только опустившись ниже 0:
test.exe -1
IF ERRORLEVEL 0 PAUSE
Условие: -1 => 0 == FALSE
Поскольку ERRORLEVEL из 1 обычно означает наличие ошибки, а 0 - отсутствие ошибки, мы можем просто увеличить минимум в условии сравнения, чтобы получить то, что мы хотим, вот так:
test.exe 0
IF ERRORLEVEL 1 PAUSE
Условие: -1 => 1 == FALSE
Условие: 0 => 1 == FALSE
Условие: 1 => 1 == TRUE
В этом примере. скрипт будет приостановлен, когда ERRORLEVEL будет 1 или выше
Обратите внимание, что это позволяет использовать коды выхода -1 так же, как 0. Что, если нужно только, чтобы 0 не останавливался? Мы можем использовать отдельный синтаксис:
test.exe 0
IF NOT %ERRORLEVEL% EQU 0 PAUSE
Условие: -1 != 0 == TRUE
Условие: 0 != 0 == FALSE
Условие: 1 != 0 == TRUE
В этом примере сценарий приостанавливается, если %ERRORLEVEL% не является 0. Мы можем сделать это, используя оператор EQU, чтобы сначала проверить, есть ли %ERRORLEVEL% EQU 0, а затем оператор NOT, чтобы получить противоположный эффект, эквивалентный оператору !=. Однако я считаю, что это работает только на машинах NT, а не на простой DOS.
Рекомендации:
http://chrisoldwood.blogspot.ca/2013/11/if-errorlevel-1-vs-if-errorlevel-neq-0.htmlhttp://ss64.com/nt/errorlevel.html
У меня это не сработало, как будто ERRORLEVEL 0 всегда возвращает false, поскольку ERRORLEVEL всегда> = 0. Ниже я разместил правильную версию.