Как вернуть ошибку из .bat в проекте Visual Studio (2008 SP1)? - PullRequest
4 голосов
/ 08 апреля 2009

У меня есть пакетный файл, который запускается на этапе пользовательской сборки Visual Studio для копирования файлов в каталог установки. Я хочу, чтобы при ошибке копирования произошла ошибка. Проблемы с опциями, которые у меня есть:

  • exit 1
    Это нормально работает в последовательности сборки, но иногда я хочу использовать пакетный файл из командной строки или из другого пакета, и в этих случаях exit вызывает вызывающего чтобы выйти.

  • exit /b 1
    Это хорошо работает из командной строки или из другого пакетного файла, но Visual Studio не распознает, что код возврата не был 0 (то есть он сообщает о проекте с ошибкой «0»). (s) ").

Я наткнулся на ссылку, которая дает мне решение: http://www.nabble.com/Re:-bjam-and-Windows-p17457249.html

По сути, он говорит, что я должен повторить сообщение об ошибке перед выполнением exit /b. Например,

echo MyProj : error : could not copy files.

Кто-нибудь точно знает, какой формат сообщения вызывает Visual Studio для распознавания ошибки?

Я пытался настроить это, и некоторые работы, а некоторые нет. Кажется, это должно соответствовать что-то вроде

.*\: .*error.*\:

Это где-нибудь задокументировано?

Спасибо.

Это с Visual Studio 2008 с пакетом обновления 1 (SP1) в Windows XP Pro с пакетом обновления 3 (в случае, если cmd.exe отличается в разных версиях Windows).

Ответы [ 5 ]

2 голосов
/ 08 апреля 2009

Относительно вашего актуального вопроса,
На этой странице указан полный синтаксис, ожидаемый VS в качестве вывода инструментов сборки.

2 голосов
/ 08 апреля 2009

Еще одна вещь, которую вы можете попробовать это:

set errorlevel=1
exit /b

Это в основном имеет тот же эффект, что и @Bill. Возвращаемое значение последней запущенной программы устанавливается в переменную среды с именем %errorlevel%, а затем при выходе из cmd.exe это значение возвращается из процесса (что читает VS)

1 голос
/ 08 апреля 2009

Как правило, возвращаемое значение пакетного файла является возвращаемым значением последней команды, выполненной из внутри пакетного файла.

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

В прежние времена DOS вы могли использовать ECHO в сочетании с командой CHOICE, чтобы установить возвращаемое значение, но, увы, оно больше не является частью окон.

Так что вместо этого вы могли бы написать небольшую программу. Что-то, что принимает желаемое возвращаемое значение в качестве аргумента, затем устанавливает и возвращает это в качестве возвращаемого значения:

#include <cstdio>

int main(int argc, char * argv[]) {

    if (argc == 2) {

        return strtoul(argv[1], NULL, 10);

    } else {
        return 0;
    }
}

Затем в своем пакетном файле вы просто вызываете программу с нужным возвращаемым значением и переходите к концу.

1 голос
/ 08 апреля 2009

Вы уверены, что тестируете это правильно? Я только что попробовал этот пакетный файл:

echo bla
exit /b 1

с VS2008, в качестве шага перед сборкой и получил это:

1>------ Build started: Project: XXXX, Configuration: Debug Win32 ------
1>Performing Pre-Build Event...
1>bla
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Windows\system32\cmd.exe'.
1>Build log was saved at "file://c:\XXXXX\BuildLog.htm"
1>XXXXX - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Я также пытался сделать это с помощью пользовательского шага сборки для файла с таким же точным результатом.
Следует отметить, что я использую VS2008- SP1 , так что может быть разница.

0 голосов
/ 30 марта 2016

По какой-то причине exit /b 12 не устанавливает код выхода при записи в шаг пост-сборки. Обычный exit 12 будет работать.

Таким образом, чтобы правильно вернуть код выхода из вашего файла bat, вы должны написать это:

call yourbat.bat
if %errorlevel% NEQ 0 exit %errorlevel%

Команда call важна при запуске файлов bat, она создает новый контекст, в котором запускается файл bat, поэтому при запуске exit /b 1 в файле bat он выходит из этого контекста, а не из всего интерпретатора команд. Затем вы можете сравнить уровень ошибки и выйти с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...