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!

Cómo redirigir la salida de consola de tu ejecutable personalizado a un archivo's console output to a file
Cómo redirigir la salida de consola de tu ejecutable personalizado a un archivo

Y por supuesto, no sólo se limita a Command Prompt (cmd.exe): también funciona en Windows PowerShell:

Cómo redirigir la salida de la consola de PowerShell de tu ejecutable personalizado a un archivo's PowerShell console output to a file
Cómo redirigir la salida de la consola de PowerShell de tu ejecutable personalizado a un archivo

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.
Para una lista más completa de los diferentes operadores disponibles, ver aquí.

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

  1. Puedes obtener las transcripciones desatendidas. No tienes que hacer nada tú mismo.
  2. 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.
  3. 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):

.

.

Envía la salida verbal al archivo especificado

Aplica salida verbosa al contenido de
el archivo especificado

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
Fuente (aplicada)

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
mm
Desarrollador / Ponente / Consultor en Koskila / Valo Solutions Ltd. / Norppandalotti Software Co. / Norppandalotti Software Co / Alter – Experience Ideas Ltd.
Antti Koskela es un orgulloso nativo digital millennial desarrollador full stack (¿son suficientes palabras de moda divertidas? ¡Sin duda son suficientes palabras de moda divertidas!), que trabaja como Arquitecto de Soluciones para Valo Intranet, el producto que hará que te enamores de tu intranet.
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).

mm
=»https:>=»https:>
Los últimos posts de Antti K. Koskela (ver todos)
  • 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

52votes
Valoración del artículo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *