simbolo - Intérprete de comandos de Windows: cómo obtener el código de salida del primer comando canalizado
lista de comandos dos completa (1)
En el ejemplo que se proporciona a continuación, ejecuto nmake y luego redirecciono STDOUT / STDERR a tee, que luego lo envía a la pantalla, y también a un archivo de registro. El problema es que estoy intentando capturar el código de salida para nmake y no tee. Lo que necesito es el código de salida de nmake, y no tee.
nmake | tee output.txt
Podría pensar que podría hacer algo como lo siguiente, pero no funcionará.
(nmake & call set myError=%%errorlevel%%) | tee output.txt
El problema radica en el mecanismo por el cual funcionan las tuberías de Windows. Cada lado de la tubería se ejecuta en su propio shell CMD. Así que cualquier variable de entorno que establezca allí desaparecerá una vez que el comando haya finalizado. Además, la expansión demorada de% errorlevel% es más complicada debido al nivel adicional de análisis, y porque el shell de CMD tiene un contexto de línea de comandos en lugar de un contexto por lotes.
Podrías hacer algo como esto:
(nmake & call echo %%^^errorlevel%% ^>myError.txt) | tee output.txt
for /f %%A in (myError.txt) do echo nmake returned %%A
del myError.txt
O puede incrustar el errorlevel en su output.txt:
(nmake & call echo nmakeReturnCode: %%^^errorlevel%%) | tee output.txt
for /f "tokens=2" %%A in (''findstr /b "nmakeReturnCode:" output.txt'') do echo nmake returned %%A
Pero la solución más simple parece ser
nmake >output.txt
set myError=%errorlevel%
type output.txt
echo nmake returned %myError%
Nota : hay muchas complicaciones sutiles cuando se trabaja con tuberías de Windows. Una buena referencia es ¿Por qué falla la expansión retardada cuando está dentro de un bloque de código canalizado? . Recomiendo leer la pregunta y todas las respuestas. La respuesta seleccionada tiene la mejor información, pero las otras respuestas ayudan a proporcionar contexto.
EDITAR 2015-06-02
Recientemente descubrí que puede usar macros DOSKEY para almacenar y recuperar de forma limpia el ERRORLEVEL desde cualquiera de los lados (o ambos) de una tubería, sin tener que recurrir a un archivo temporal. Obtuve la idea del usuario Ed Dyreen de DosTips en http://www.dostips.com/forum/viewtopic.php?p=41409#p41409 . Las macros de DOSKEY no pueden ejecutarse por lotes, pero las definiciones persisten después de que ENDLOCAL y CMD / C salgan.
Aquí es cómo lo utilizarías en tu situación:
(nmake & call doskey /exename=err err=%%^^errorlevel%%) | tee output.txt
for /f "tokens=2 delims==" %%A in (''doskey /m:err'') do echo nmake returned %%A
Si lo desea, puede agregar un comando más al final para borrar la definición de la "macro" errada después de haber recuperado el valor.
doskey /exename=err err=