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. Por lo tanto, cualquier variable de entorno que establezca allí desaparecerá una vez que el comando haya finalizado. Además, la expansión retrasada de% errorlevel% es más complicada debido al nivel adicional de análisis, y porque el shell CMD tiene un contexto de línea de comandos en lugar de un contexto de proceso por lotes.
Se podría 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 nivel de error en su salida.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 Why does delayed expansion fail when inside a piped block of code?. 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
he descubierto recientemente que puede utilizar macros DOSKEY para almacenar de forma limpia y recuperar el ERRORLEVEL de uno (o ambos) lados de una tubería, sin recurrir a una archivo temporal. Recibí la idea del usuario de DosTips Ed Dyreen al http://www.dostips.com/forum/viewtopic.php?p=41409#p41409. Las macros DOSKEY no se pueden ejecutar por lotes, ¡pero las definiciones persisten una vez que hayan salido ENDLOCAL y CMD/C!
Aquí es cómo usted lo utilizaría en su 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 una más comandos al final para aclarar la definición de la err "macro", después de que haya recuperado la valor.
doskey /exename=err err=
La solución simple elimina las principales razones para usar tee (salida simultánea). También para la primera solución se puede usar "set/p MY_ERROR =
Cuál es el trato con 'set' llamada, llamada' echo' y así sucesivamente? Nunca he visto esta sintaxis antes. – alecov
@Alek - Es un viejo truco para obtener una segunda ronda de expansión variable después del análisis inicial. Es una alternativa al uso de la expansión retrasada. 'echo! var!' es similar a 'call echo %% var %%'. Por lo general, se prefiere la expansión retrasada, pero a veces se necesita el hack de CALL. – dbenham