Вернуть код ошибки из дочернего приглашения cmd в родительское приглашение cmd в пакете - PullRequest
0 голосов
/ 22 января 2020

У меня есть родительский scipt: test.bat

@Echo off
SETLOCAL ENABLEDELAYEDEXPANSION
start cmd /c a.bat ^& echo %errorLevel% ^> exitcode.txt

if exist exitcode.txt (
    echo ERROR in a.bat file
)
ECHO Reached the EOF

Дочерний scipt: a.bat

echo off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%A IN (1,1,1000) DO (
echo value in loop %%A 
)
exit /b 0

Я хочу проверить уровень ошибок в test.bat только после .bat завершен. ПРИМЕЧАНИЕ: a.bat может вызываться из test.bat более одного раза. Все a.bat будут работать параллельно. И Test.bat будет ждать, пока не завершится выполнение всех файлов .bat. Теперь test.bat завершается до завершения a.bat. Кто-нибудь может помочь с этим?

1 Ответ

0 голосов
/ 22 января 2020

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

СМОТРИТЕ ЗДЕСЬ, КАК УДЕРЖАТЬ ПРОГРАММУ РОДИТЕЛЯ ДО ВСЕХ ЗАВЕРШЕННЫХ ПОДПИСЕЙ

@Echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:controller

Call :launcher "a.bat" "b.bat" "c.bat"

pause
EXIT

:launcher
Set count=0
For %%a in (%*) Do (
Set /a count+=1
Set "Prog[!count!]=%%~a"
Start "+++batch+++" "%%~a"
)

:loop
    timeout /t 1 >nul
    tasklist /fi "windowtitle eq +++batch+++*" |find "cmd.exe" >nul && goto :loop

REM :: Note- This method exits subs on encountering First Error.

For /L %%B IN (1,1,!count!) DO (
FOR %%N IN (!Prog[%%B]!) DO (
    IF EXIST "%%~nN_exitcode.txt" (
        <"%%~nN_exitcode.txt" (
        Set /p exitcode=
        Set /p E_P=
        Set /p L_N=
        )
        DEL /Q "%%~nN_exitcode.txt"
        IF DEFINED exitcode (
        ECHO Errorlevel !exitcode! returned in !E_P! at Line !L_N!
        )
    ) else (
        ECHO Sub %%~nN completed succesfully
        )
    )
)

GOTO :EOF

Примеры дочерней программы:

a.bat

@ECHO OFF
Setlocal EnableDelayedExpansion
CALL Hello|| (ECHO(!errorlevel!&ECHO(%~nx0&ECHO(3)>%~n0_exitcode.txt && EXIT
ECHO HELLO|| (ECHO(!errorlevel!&ECHO(%~nx0&ECHO(4)>%~n0_exitcode.txt && EXIT
exit

b.bat:

@ECHO OFF
Setlocal EnableDelayedExpansion
ECHO Hello|| (ECHO(!errorlevel!&ECHO(%~nx0&ECHO(3)>%~n0_exitcode.txt && EXIT
CALL HELLO|| (ECHO(!errorlevel!&ECHO(%~nx0&ECHO(4)>%~n0_exitcode.txt && EXIT
exit

c .bat

@ECHO OFF
Setlocal EnableDelayedExpansion
ECHO Hello|| (ECHO(!errorlevel!&ECHO(%~nx0&ECHO(3)>%~n0_exitcode.txt && EXIT
ECHO HELLO|| (ECHO(!errorlevel!&ECHO(%~nx0&ECHO(4)>%~n0_exitcode.txt && EXIT
exit

|| (ECHO(!errorlevel!&ECHO(%~nx0&ECHO(4)>%~n0_exitcode.txt && EXIT создает файл только в случае сбоя предыдущей команды.

  • ECHO(!errorlevel! Сохраняет уровень ошибки в первой строке дополнительного файла c Exitcode file.
  • ECHO(%~nx0 Сохраняет имя файла и расширение для второй строки.
  • ECHO(n Сохраняет номер строки в третьей строке. Вам нужно будет настроить этот номер в соответствии со строкой в ​​вашем коде, команда Использование этого инструмента отладки расположена в.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...