Проблема передачи кода из halt в переменную %ERRORLEVEL%

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Проблема передачи кода из halt в переменную %ERRORLEVEL%

Сообщение PapaNT »

Всем доброго времени года!

Заморочился написать весьма хитрый батник (среда выполнения Windows Server 2003*32|2012*64). В батнике стоит вызов моей утилиты завершающейся halt(Info) (код утилиты отдебажен и завершается именно этой строкой с Info=4). После выполнения моей утилиты в батнике переменная erorlevel упорно сохраняет значение 0.
Замена вызова Halt(Info) на ExitCode := Info также не привела к желаемому результату :(

Как гарантированно передать значение кода возврата в батник?
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Следующая программа тоже возвращает 0?

Код: Выделить всё

begin
    halt(4)
end.


Пример батника можно увидеть?
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

Да. 0 и после такого кода :(

Добавлено спустя 5 минут 8 секунд:
Похоже, что это старая проблема:

Два примера:
http://qc.embarcadero.com/wc/qcmain.aspx?d=51427
http://qc.embarcadero.com/wc/qcmain.aspx?d=77200
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Перечисленные примеры не подходят для предложенной простейшей программы. Покажите пример батника.
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

Код: Выделить всё

my.exe
rem call my.exe также пробовал

%errorlevel%
rem Пробовал также:
rem echo %errorlevel%
rem if %errorlevel% NEQ 4 echo %errorlevel%



Во всех вариантах нулевой код в errorlevel.
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

torun.pas:

Код: Выделить всё

program torun;
begin
  halt(4);
end.


testbat.bat

Код: Выделить всё

torun.exe

echo %ERRORLEVEL%


запускаю testbat.bat

Код: Выделить всё

C:\FPC_Laz\testbat>echo 4
4

Надеюсь, поможет :)
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

Возможно, мой uses crt мешает...

P.S.: свой exe я собирай на 2.6.0
скалогрыз
долгожитель
Сообщения: 1804
Зарегистрирован: 03.09.2008 02:36:48

Сообщение скалогрыз »

PapaNT писал(а):Возможно, мой uses crt мешает...

не вопрос!

torun.pas

Код: Выделить всё

program torun;
uses  crt;
begin
  clrscr;
  halt(5);
end.


testbat.bat

Код: Выделить всё

torun.exe

echo %ERRORLEVEL%


запускаю testbat.bat

Код: Выделить всё

C:\FPC_Laz\testbat>echo 5
5

собираю fpc 2.6.4
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

PapaNT а ты его переписывал?
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

А я писал анализ errorlevel в теле цикла.
Оказалось, что заработало только когда воткнул программу с кодом:

Код: Выделить всё

begin
  clrscr;
  halt(4);
end.

перед входом в цикл. После этого не все заработало:

Код: Выделить всё

halt4.exe
for /F in "tokens=1,2" %%i in (my_file.txt) do (call my.exe %%i %%j
                                                if %errorlevel% NEQ 4 echo error 4)



Упс... В цикле видит только внешнюю к циклу переменную errorlevel :(((

Добавлено спустя 34 минуты 17 секунд:
Вылечил.

Надо было малость поправить батник:

Код: Выделить всё

Setlocal EnableDelayedExpansion
for /F in "tokens=1,2" %%i in (my_file.txt) do (call my.exe %%i %%j
                                                if "!errorlevel!"=="4" echo errorcode 4)
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

решено. Ветку можно закрывать.
Ответить