возврат уровня ошибки из пакетной функции не работает

У меня есть функция в пакетном скрипте:

:run
set "CMD=%*"
<...>
timeout 300s !CMD!
if %errorlevel% equ 0 (
    echo !CMD! >>  ./!_tool!.OK
) else (
    echo !CMD! >>  ./!_tool!.FAIL
    echo exitcode= %errorlevel% >> ./FAIL
    echo ===STOP=== %date% %time%
    exit /b %errorlevel%
)
exit /b %errorlevel%

и я проверяю его код %errorlevel% в основном цикле:

for /f "tokens=*" %%t in (%TEST_LIST%) do (
    <...>
    call :run %TOOL% -O0 -S %REPO_PATH%\%%t
    if %errorlevel% equ 0 (
        echo %%t PASSED
    ) else (
        echo %%t FAILED
    )

Но проблема, когда timeout 300s !CMD! возвращает уровень ошибки 1 и возвращает exit /b %errorlevel% как 1 (./!_tool!.FAIL создается и т. д.), не влияет на IF основного цикла, и я все равно получаю echo %%t PASSED.

Нельзя проверить код возврата функции таким образом или как?

P.S. Некоторый код ‹...> работает правильно, поэтому я его вырезал


person mechanic    schedule 18.05.2016    source источник
comment
может быть, вы используете отложенное расширение не в том месте?   -  person Stephan    schedule 18.05.2016
comment
@Stephan, я использую его с самого начала скрипта (на самом деле не знаю, когда я не могу его использовать, знаю, что это требуется только для циклов), как он может испортить вещи, связанные с кодами ошибок?   -  person mechanic    schedule 18.05.2016
comment
хорошо - вы используете %errorlevel% внутри блока, где вы должны использовать !errorlevel! - и я не вижу причин использовать !cmd! вместо %cmd% (я не говорю, что _ нет_ причин, но, насколько я вижу, их нет)   -  person Stephan    schedule 18.05.2016
comment
@Стефан, о каком блоке ты говоришь? Цикл FOR или функция :run? Должен ли я использовать ВСЕ переменные в любом блоке (), как !this! ?   -  person mechanic    schedule 19.05.2016
comment
Я про все блоки. Только те переменные, которые изменились в том же блоке, должны быть задержаны. См. мои примеры и связанные с ними вопросы. Также хорошей отправной точкой является ss64.   -  person Stephan    schedule 19.05.2016
comment
@Stephan, спасибо, я должен попробовать использовать отложенный уровень ошибок и скоро сообщить   -  person mechanic    schedule 19.05.2016


Ответы (1)


Благодаря @Stephan я нашел свою проблему - я должен использовать !errorlevel! вместо %errorlevel% в своем цикле FOR, поскольку он должен обновлять каждую итерацию

person mechanic    schedule 19.05.2016