Este post se actualizó por última vez el 7 de diciembre de 2020.
4 min read.
De vez en cuando, te encuentras con una situación, en la que necesitarás volcar de alguna manera la salida de la consola (o transcripción) de la ejecución de una aplicación de consola. En realidad, voy a argumentar que sucede mucho más a menudo de lo que uno podría pensar – en mi caso, cada vez que un cliente requiere un webjob o una función, que uno normalmente desplegaría en Azure, siendo ejecutado en los servidores del cliente. Este post describe cómo hacerlo.
Problema
Tabla de contenidos
Algo se rompe o la aplicación se cuelga, y el error se registra en el registro de eventos… Pero sólo el error, no toda la transcripción. Te gustaría tenerlo todo, para saber qué está pasando realmente, pero el registro de eventos no es el camino.
O quizás estás investigando un error que le ha ocurrido a otra persona, pero sólo obtienes capturas de pantalla de los errores de la consola o del registro de eventos, mientras que tú querrías obtener toda la información posible sobre el problema.
¿Qué hacer?
Solución: ¡el operador de redirección > al rescate!
Es por suerte bastante fácil. Hay múltiples formas de canalizar, volcar, redirigir, registrar, reflejar o simplemente guardar la salida a casi cualquier medio de destino imaginable, pero como odio estar siempre buscando en Google (y por mi vida, parece que no puedo recordarlo de memoria), estoy documentando mi forma preferida aquí.
No es necesario canalizar la salida a archivo – porque la redirección hace de forma nativa lo que podrías hacer con una tubería y «Out-File -FilePath» o un comando similar.
¿Cómo redirigir la salida a archivo en Powershell?
Puedes dirigir toda la salida de la consola (y por tanto toda la transcripción de PowerShell para tu ejecutable) a un archivo de texto haciendo algo como esto:
executable.exe > output.txt 2>&1
O
executable.exe *>&> output.txt
Este método simplemente escribe todo lo de la ventana de la consola a un archivo, ¡así de simple!
Y por supuesto, no sólo se limita a Command Prompt (cmd.exe): también funciona en Windows PowerShell:
Si quieres comprobar que esto funciona, puedes ejecutar lo siguiente en PowerShell – primero da salida a «Hello World» y luego simplemente lo redirige a la salida del archivo.txt:
echo «Hello World» >output.txt 2>&1.\Noutput.txt
El segundo comando debería abrir output.txt en el editor de texto – y debería contener «Hello World».
En estos ejemplos, los siguientes parámetros afectan al resultado:
Elemento | Descripción | Operador de redirección: > | Escribe la salida del comando en un archivo o en un dispositivo, como una impresora, en lugar de en la ventana del símbolo del sistema. | 2>&1 | Estos parámetros hacen que este comando redirija primero stdout (flujo de salida estándar) al archivo de salida, y luego redirige stderr (flujo de error estándar) allí también. |
Bien – así que ahora finalmente está documentado. Tal vez no tenga que buscar en Google la próxima vez 🙂
Espera… ¿Pero cómo es esto mejor que copiar y pegar desde una ventana de la consola?
Si no estás ejecutando tu aplicación de forma desatendida, podrías simplemente ejecutar la aplicación y copiar-pegar desde la ventana a tu ubicación preferida. ¡Eso es bonito y fácil! Entonces, ¿qué hace que este método sea mejor?
Se me ocurren un par de cosas:
Por qué volcar la salida de la consola a un archivo es mejor que simplemente copiar-pegar
- Puedes obtener las transcripciones desatendidas. No tienes que hacer nada tú mismo.
- De esta manera, no estropearás el copiado seleccionando en zonas de la salida.
- No sé tú, pero yo suelo estropear el copiado-pegado desde una consola o ventana de PowerShell. Este método hace que eso sea imposible.
- Esta es la forma más fácil que he encontrado para pedir a otras personas toda la salida/transcripción de una aplicación de consola ejecutada.
- Eso es realmente útil, porque cuando estoy depurando, realmente quiero todo el registro, y no sólo las últimas líneas de texto rojo!
Más pensamientos
Para más información y opciones sobre los escenarios de salida, vea este hilo de Stack Overflow. Si quieres leer más sobre stdout y stderr, echa un vistazo a esto.
Y para más referencia, aquí hay una lista de todos los operadores de redirección soportados para versiones razonablemente recientes de PowerShell (probablemente válida para PowerShell >5.1):
Redirección | ¿Qué hace? |
---|---|
> | Envía la salida al archivo especificado |
>> | Aplica la salida al contenido del archivo especificado |
2> | Envía los errores al archivo especificado. |
2>> | Aplica los errores al contenido del archivo especificado. archivo |
2>&1 | Envía los errores y la salida de éxito a el flujo de salida de éxito |
3> | Envía las advertencias al archivo especificado |
3>> | Aplica las advertencias al contenido del archivo especificado. |
3>&1 | Envía las advertencias y la salida de éxito al flujo de salida de éxito |
4> | |
4>> | |
4>&1 | Envía la salida verbosa y salida de éxito al flujo de salida de éxito | 5> | Envía mensajes de depuración al archivo especificado | 5>> | Aplica mensajes de depuración al contenido del archivo especificado |
5>&1 | Envía mensajes de depuración y salida de éxito a el flujo de salida de éxito |
6> | Envía mensajes informativos a un archivo especificado | 6>> | Aplica mensajes informativos al contenido de un archivo especificado |
6>&1 | Envía los mensajes informativos y la salida de éxito al flujo de salida de éxito. |
*> | Envía todos los tipos de salida al archivo especificado |
*>> | Aplica todos los tipos de salida al contenido del archivo especificado |
*>&1 | Envía todos los tipos de salida al flujo de salida de éxito |
Sin embargo, un escenario mucho más avanzado sería guardar la salida directamente en Application Insights o algo similar. Para muchos casos, esto sería como matar una mosca con un bazooka, pero para despliegues más grandes, por qué no. Tal vez valga la pena una entrada en el blog más tarde!
- Autor
- Postes recientes
Ha sido desarrollador desde 2004 (empezando con PHP y Java), y ha estado doblando y retorciendo SharePoint en diferentes formas desde MOSS. Hoy en día no sólo trabaja en SharePoint, sino también en proyectos .NET, Azure, Office 365 y un montón de cosas más. También es Microsoft MVP para el desarrollo de Office.
Este es su blog personal profesional (por ejemplo, profesional, pero definitivamente personal).
- Guía: ¿Cómo tomar el control y matar a un inquilino viral de AAD? – 24 de marzo de 2021
- ¿Cómo listar todos los ensamblados cargados en una sesión de PowerShell? – 18 de marzo de 2021
- Por supuesto que aún te #ValoLove – 15 de marzo, 2021