2010-05-18 5 views
10

est-il possible de retourner le errorlevel aussi si je redirigez la sortie d'un script dans un fichier journal:fichier batch de Windows: Tuyau détruit mon code de retour

test1.bat:

call test2.bat 2>&1 | tee log.txt 
echo ERRORLEVEL: %ERRORLEVEL% 

test2.bat:

exit /B 1 

sortie lors de l'appel test1.bat:

ERRORLEVEL: 0 

Le errorlevel est toujours 0.

Le problème est, je veux appeler un autre script dans mon script où la sortie doit être réorienté de manière synchrone avec la sortie indiqué dans la ligne de commande, donc simple > ne me suffit pas. J'ai essayé plusieurs idées, mais le résultat est que le tuyau toujours semble détruire le niveau d'erreur donné ... :(

Pouvez-vous me donner d'autres suggestions?

Merci à l'avance ... :)


Merci pour votre réponse ... Malheureusement, cela ne fonctionne pas aussi bien ... :(voir ce que j'ai essayé:

test1.bat:

echo off 
set VAR1=" " 
echo VAR1 before test2: %VAR1% 
call test2.bat 2>&1 | tee log.txt 
echo VAR1 after test2: %VAR1% 

test2:

@echo off 
set VAR1=ERROR 
echo VAR1 in test2: %VAR1% 
exit /B 1 

Sortie lorsque vous appelez test1.bat:

VAR1 before test2: " " 
VAR1 in test2: ERROR 
VAR1 after test2: " " 

Comme d'autre solution que j'ai essayé de sauver "ERRORVALUE: 1" dans le fichier journal en cas d'erreur. Dans le principal, je voulais analyser le journal à la recherche de cette chaîne. sauver Malheureusement, la découverte, résultat à une variable d'environnement ne fonctionne pas aussi bien, je ne comme suit:

FOR /F "tokens=1 delims=" %%A in ('type %logDir%\03_applySqls.log | find /c "ERRORVALUE: 1"') do SET val=%%A 

erreur que je reçois:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar. 

Alors, comment puis-je au moins analyser mon fichier journal et cas la chaîne est trouvée dans le journal je peux retourner la valeur comme un niveau d'erreur?

+0

très liés: http://stackoverflow.com/questions/11170753/windows-command-interpreter-how-to-obtain-exit-code-of-first -piped-commande – eckes

Répondre

1

Eh bien, le problème est que tee quitte après votre fichier séquentiel et par conséquent son propre code de sortie écrase celui du fichier de commandes.

Il y a (à ma connaissance) peu de choses que vous pouvez faire à ce sujet, sauf utiliser un autre mécanisme de gestion des erreurs. Vous pouvez utiliser une variable d'environnement pour stocker le code de sortie de votre lot. tee ne touchera pas cela.

1

Que diriez-vous:

FOR /F "tokens=1 delims=" %%A in ('find /c "ERRORVALUE: 1" %logDir%\03_applySqls.log') do SET val=%%A 
2

Nasty. Je ne peux que suggérer un fichier batch encapsulé qui écrase le code de sortie d'une commande passée. Une variable d'environnement ne coupera pas tout à fait la moutarde ici. Je suggère d'écrire à un fd utilisé, dire 4.

wr.cmd:

call %* 
echo %errorlevel% >&4 
echo Some error message >&2 

C'est un peu délicate car fd 4 doit être ouvert lorsque wr.cmd est appelé. Pour tester l'intérêt, ici, j'écho Some error message à stderr pour montrer que ce texte reste séparé du niveau d'erreur.

test1.bat:

call wr test2.bat 4>fail.txt 2>&1 | tee log.txt 
set /p fail= <fail.txt 
echo FAIL: %fail% 
Questions connexes