2010-05-18 14 views
10

es posible regresar al nivel de error si también canalizar la salida de un script en un archivo de registro:archivo por lotes de Windows: Pipe destruye mi código de retorno

Test1.bat:

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

test2.bat:

exit /B 1 

salida Test1.bat al llamar:

ERRORLEVEL: 0 

El nivel de error es siempre 0.

El problema es, quiero llamar a otro script dentro de mi guión donde la salida debe ser redirigido de forma sincronizada con el resultado que se muestra en la línea de comandos, por lo tanto, un simple > no es suficiente para mí. He intentado varias ideas, pero resultado es que la tubería siempre parece destruir el nivel de error dado ... :(

¿Me puede dar más sugerencias?

Gracias de antemano ... :)


Gracias por su respuesta ... Desafortunadamente esto no funciona así ... :(Ver lo que he intentado:

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 

salida al llamar Test1.bat:

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

Como otra solución traté de salvar "ERRORVALUE: 1" en el archivo de registro en caso de que haya un error. En el mainscript quería analizar el registro buscando esta cadena. Desafortunadamente salvar el hallazgo-resultado a una variable de entorno no funciona tan bien, yo como sigue:

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

error que consigo:

"|" ist syntaktisch an dieser Stelle nicht verarbeitbar. 

Entonces, ¿cómo puedo al menos analizar mi archivo de registro y en caso de que la cadena se encuentre en el registro, ¿puedo devolver el valor como un nivel de error?

+0

muy relacionados: http://stackoverflow.com/questions/11170753/windows-command-interpreter-how-to-obtain-exit-code-of-first -piped-command – eckes

Respuesta

1

Bueno, el problema es que tee salidas después de su archivo por lotes y por lo tanto su propio código de salida sobrescribe el del archivo por lotes.

No hay (que sepa) poco que pueda hacer al respecto, excepto el uso de otro mecanismo de manejo de errores. Puede usar una variable de entorno para almacenar el código de salida de su lote. tee no tocará eso.

1

¿Qué tal:

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

desagradable. Solo puedo sugerir un archivo por lotes envoltorio que guarda el código de salida de un comando pasado. Una variable de entorno no cortará completamente la mostaza aquí. Yo sugiero escribir a un fd no utilizada, digo 4.

wr.cmd:

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

Esto es un poco difícil como FD 4 debe estar abierto cuando wr.cmd se llama. Para fines de prueba, aquí hago eco de Some error message a stderr para mostrar que dicho texto permanece separado del nivel de error.

Test1.bat:

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