2016-05-18 1 views
0

J'ai une fonction dans le script batch:retour errorlevel de la fonction de traitement par lots ne marche pas le travail

: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% 

et im vérifiant son% code ERRORLEVEL% dans le cycle principal:

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 
    ) 

Mais le problème lorsque timeout 300s !CMD! renvoie errorlevel 1 et renvoie exit /b %errorlevel% en tant que 1 (./!_tool!.FAIL étant créé et ainsi de suite) n'affecte pas l'IF du cycle principal et n'obtient echo %%t PASSED de toute façon.

Impossible de faire fonctionner le code de retour à vérifier de cette façon ou quoi?

P.S. Certains < ...> code fonctionne correctement, donc je l'ai couper

+2

peut-être, vous utilisez [extension retardée] (http://stackoverflow.com/a/30284028/2152082) aux mauvais endroits? – Stephan

+0

@Stephan je l'utilise depuis le début du script (je ne sais pas vraiment quand je ne peux pas l'utiliser, seuls les cycles le demandent), comment peut-il gâcher des choses liées aux codes d'erreur? – mechanic

+0

bien - vous utilisez '% errorlevel%' dans un bloc où vous devriez utiliser '! Errorlevel!' - et je ne vois aucune raison d'utiliser '! Cmd!' Au lieu de '% cmd%' (je ne dis pas, là _ is_ pas de raison, mais d'après ce que je peux voir, il n'y en a pas) – Stephan

Répondre

0

Merci à je @Stephan ai trouvé mon problème - je devrais utiliser !errorlevel! au lieu de %errorlevel% dans ma boucle FOR donc il doit actualiser chaque itération