首页 > 解决方案 > 将错误代码从子 cmd 提示符批量返回到其父 cmd 提示符

问题描述

我有一个父 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

我只想在 a.bat 完成后检查 test.bat 中的错误级别。注意:a.bat 可以从 test.bat 中多次调用。所有 a.bat 将并行运行。而Test.bat 会一直等到所有a.bat 文件执行完毕。现在, test.bat 在 a.bat 完成之前完成。有人可以帮忙吗?

标签: windowsbatch-filecmd

解决方案


要使用 start,您需要修改所有子程序以在出错时创建退出代码文件。

请参阅此处了解如何在所有订阅完成之前持有父计划

@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

儿童计划示例:

一只蝙蝠

@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.蝙蝠:

@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!将错误级别存储到子特定退出代码文件的第一行。
  • ECHO(%~nx0将文件名和扩展名存储到第二行。
  • ECHO(n将行号存储到第三行。您需要将此数字调整为代码中使用此调试工具的命令所在的行。

推荐阅读