Приостановите GNU Make в консоли Windows, если возникла ошибка

Частью установки приложения, за которое я отвечаю, является компиляция некоторых библиотек кода C. Это делается в консоли с помощью GNU Make.

Итак, как часть установки, открывается окно консоли, вы видите мастер вывода файла make по мере его компиляции и связывания, по завершении окно консоли закрывается, и программа установки продолжает работу.

Все хорошо, если только нет ошибки компиляции. Затем make-файл выдает ошибку, и окно консоли закрывается, прежде чем у вас появится возможность выяснить, что происходит.

Итак, я бы хотел, чтобы окно консоли приостанавливалось с функциональностью типа «нажмите клавишу, чтобы продолжить», если есть ошибка из make-файла, чтобы консоль оставалась открытой. В противном случае просто выйдите как обычно и закройте консоль.

Я не могу понять, как это сделать в файле Makefile GNU или из командного файла, который мог бы запускать Make.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
5 442
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

это должно сработать:

if not ERRORLEVEL 0 pause

введите help if в DOS для получения дополнительной информации об использовании уровня ошибок.

У меня это не сработало, как будто ERRORLEVEL 0 всегда возвращает false, поскольку ERRORLEVEL всегда> = 0. Ниже я разместил правильную версию.

Benja 21.10.2011 17:49

Я не вижу в этом проблемы. errorlevel определяется разработчиком программы как код выхода приложения, и он указывает на ошибку, если он не равен 0. Если по какой-либо причине разработчик выбрал выход с кодом 2 или 7, мое условие будет оцениваться как истинное, в то время как «если ERRORLEVEL 1 "будет оцениваться как ложное.

Amir Arad 02.11.2011 19:28

Извините, вы в порядке, просто я использую .bat для запуска службы, и, очевидно, если вы закроете ее с помощью Ctrl + C, она выйдет с ERRORLEVEL 130, и я не хотел, чтобы окно оставалось открытым на тот случай.

Benja 26.01.2012 20:05

это не работает. Я попытался использовать команду копирования (вместо копирования), но она не останавливается. if ERRORLEVEL 1 пауза работает.

Ray Cheng 16.05.2012 23:53

Это решение не работает с файлами Batch / CMD. ERRORLEVEL 0 относится к ERRORLEVEL => 0. Это всегда будет истинный, кроме ERRORLEVEL = -1. Применение NOT просто инвертирует его. Следовательно, за исключением ERRORLEVEL = -1, приведенный выше код всегда будет ложный. Пожалуйста, прочтите: ss64.com/nt/if.html

bryc 10.12.2016 23:42

@bryc то, что вы написали, кажется очень разумным. однако я отчетливо помню, как тестировал это в Windows (7?) и сравнивал его с альтернативой if ERRORLEVEL 1 pause внутри файла .bat. по крайней мере, в моих сценариях я получил ложный ответ от альтернативы. Попробую воспроизвести, когда найду машину с windows

Amir Arad 22.12.2016 12:49

Вы пробовали команду паузы?

@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

Другие вопросы по теме