繁体   English   中英

将错误代码从子 cmd 提示符批量返回到其父 cmd 提示符

[英]Return Errorcode from child cmd prompt to its parent cmd prompt in batch

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

子脚本: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 完成之前就完成了。 任何人都可以帮忙吗?

要使用 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

蝙蝠

@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(4)>%~n0_exitcode.txt && EXIT仅在前面的命令失败时创建文件。

  • ECHO(!errorlevel!将错误级别存储到子特定退出代码文件的第一行。
  • ECHO(%~nx0将文件名和扩展名存储到第二行。
  • ECHO(n将行号存储到第三行。您需要将此行号调整为代码中的行,命令 Using this Debugging tool 位于。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM