PowerShell Write-Output: Tu Amigable Compañero de Salida

Di adiós al aburrido y predecible resultado del script. Con el cmdlet Write-Output de PowerShell, puedes añadir un toque de creatividad y personalidad a tus scripts de PowerShell.

El cmdlet Write-Output es una herramienta poderosa y un compañero perfecto para todas tus necesidades de automatización y gestión de sistemas. Y en este tutorial, aprenderás a maximizar el potencial del cmdlet Write-Output.

¿Listo? ¡Sigue leyendo y descubre la magia del cmdlet Write-Output!

Prerrequisitos

Este tutorial será una demostración práctica. Para seguirlo, asegúrate de tener un ordenador con PowerShell instalado (preferiblemente la última versión). Este tutorial utiliza Windows 10 con PowerShell 7 instalado.

Mostrar Objetos en la Consola

El cmdlet Write-Output de PowerShell escribe objetos en el flujo de salida y muestra el resultado de un comando o mensaje en la consola. Pero te sorprenderá cómo esta herramienta hace que la salida sea más significativa y valiosa.

En lugar de mostrar la salida en la consola, utiliza el cmdlet Write-Output para personalizar la salida. El cmdlet Write-Output puede mostrar cualquier objeto o tipo de dato, como cadenas, enteros, matrices e incluso objetos complejos.

Ejecuta el siguiente comando para mostrar un mensaje Hello, World! en la consola.

Write-Output "Hello, World!”

A continuación, puedes ver la función más básica del cmdlet Write-Output. Pero sigue leyendo para aprender sobre usos intermedios y avanzados de este cmdlet.<>

Outputting objects to the console

Pasar Objetos a Otro Comando

Además de mostrar la salida en la consola, puedes usar el comando Write-Output para enviar el objeto a otro comando para un procesamiento adicional. ¿Cómo? Usando el operador de canalización (|). La Canalización hace que Write-Output sea un comando útil y versátil para tareas de automatización y gestión del sistema.

Supongamos que deseas ver qué proceso consume la mayor parte de tus recursos, como la CPU.

Ejecuta los comandos a continuación para realizar lo siguiente:

  • Obtener una lista de todos los procesos (Get-Process) en ejecución en tu sistema.
  • Salida la lista al pipeline, que luego se pasa al comando Sort-Object. El operador de pipeline te permite encadenar múltiples comandos y procesar la salida de un comando como la entrada para otro.
  • Ordena la lista de procesos (Sort-Object) por su uso de CPU en orden -Descending.
$processes = Get-Process
Write-Output $processes | Sort-Object CPU -Descending

Ten en cuenta que puedes poner cualquiera de los comandos de este tutorial en un script de PowerShell y ejecutarlo.

La lista ordenada se muestra en la consola, como se muestra a continuación.

Passing objects to another command

Mostrando Objetos con un Formato Personalizado

Has visto el formato básico de salida del cmdlet Write-Output, que funciona bien. Pero si quieres, también puedes mostrar objetos con un formato personalizado para añadir un toque personal. Un formato personalizado puede ser útil cuando deseas mostrar propiedades específicas del objeto o personalizar la apariencia de la salida.

Para mostrar un objeto con un formato personalizado, el Format-Custom junto con el cmdlet Write-Output hará el truco, de la siguiente manera:

para crear el formato de salida personalizado, y luego enviar la salida del cmdlet Format-Custom a Write-Output.<>

Ejecuta el siguiente comando, que no produce salida, pero crea un objeto (una hashtable) que contiene tres propiedades con los valores correspondientes para mostrar.

$object = [pscustomobject]@{
Property1 = "Value1"
Property2 = "Value2"
Property3 = "Value3"
}

Ahora, ejecuta el siguiente comando para realizar lo siguiente:

  • Crea un formato personalizado (Format-Table) para la salida (Write-Output) de tu hashtable ($object). Las propiedades Property1, Property2, y Property3 se establecen como columnas.
  • Ajusta el ancho de las columnas (-AutoSize) para que se ajusten al contenido.
$object | Format-Table -Property Property1, Property2, Property3 -AutoSize | Write-Output
Creating a custom format for an object output

Alternativamente, puedes usar el cmdlet Format-List con Write-Output para mostrar el objeto como una lista de pares propiedad-valor.

$object | Format-List -Property Property1, Property2, Property3 | Write-Output
Outputting the object as a list of property-value pairs

Pasar un Objeto de Colección como una Entidad Única

De forma predeterminada, Write-Output envía cada elemento de la colección a través del pipeline por separado, un proceso llamado enumeración. Pero puedes evitar este comportamiento añadiendo el parámetro -NoEnumerate, pasando el objeto de la colección completa como una entidad única.

Para ver cómo funciona el parámetro -NoEnumerate, sigue estos pasos:

Ejecuta los comandos a continuación para realizar lo siguiente:

  • Declara un array de $numbers del uno al tres (1,2,3).
  • Cuenta el número de objetos (Measure-Object) que se pasan a través del pipeline.
  • Salida de la medición del objeto (Write-Output $numbers).

Sin el parámetro NoEnumerate, Measure-Object devuelve un recuento de tres (3), ya que cada elemento del array $numbers fue enumerado y pasado individualmente a través del pipeline.

# Declaración de un Array
$numbers = 1,2,3
# Muestra el recuento de objetos pasados a través del pipeline
Write-Output $numbers | Measure-Object
Outputting an array object measurement

Ahora, ejecuta los siguientes comandos para mostrar el recuento de los objetos pasados a través del pipeline.

Pero como agregaste el parámetro -NoEnumerate, el cmdlet Measure-Object trata al objeto como una entidad única, devolviendo un recuento de uno (1).

# Declaración de un Array
$numbers = 1,2,3
# Muestra el recuento de objetos como una entidad única pasada a través del pipeline
Write-Output -NoEnumerate $numbers | Measure-Object
Outputting object count as a single entity

Encerrar el comando Write-Output entre paréntesis (es decir, (Write-Output 1,2,3)) forzará la enumeración a ocurrir independientemente del parámetro -NoEnumerate.

Creación de un sistema de menú y solicitudes de entrada

Otro excelente uso del cmdlet Write-Output es la creación de un sistema de menú con un script de PowerShell que solicita al usuario una entrada.

Crea un archivo .ps1 con tu editor de texto/código preferido, completa el código a continuación y guarda el archivo. Puedes nombrar el archivo como desees, pero la elección de este tutorial es myoutput.ps1.

El código a continuación utiliza un bucle para solicitar continuamente al usuario que seleccione una opción de una lista de opciones hasta que el usuario seleccione la opción Salir.

# Inicializa la variable $exit a $false
$exit = $false

# Inicia un bucle que se ejecutará hasta que el usuario seleccione la opción "Salir"
while (!$exit) {

  # Muestra una lista de opciones al usuario
  Write-Output "Please select from the following options:"
  Write-Output "1. Option 1"
  Write-Output "2. Option 2"
  Write-Output "3. Option 3"
  Write-Output "4. Exit"

  # Solicita al usuario que haga una selección
  $selection = Read-Host

  # Utiliza una declaración switch para ejecutar diferentes códigos según la selección del usuario
  switch ($selection) {
    1 {
      # Si el usuario selecciona la opción 1, muestra un mensaje y haz algo para la opción 1
      Write-Output "You selected Option 1."
      # Haz algo para la opción 1
    }
    2 {
      # Si el usuario selecciona la opción 2, muestra un mensaje y haz algo para la opción 2
      Write-Output "You selected Option 2."
      # Haz algo para la opción 2
    }
    3 {
      # Si el usuario selecciona la opción 3, muestra un mensaje y haz algo para la opción 3
      Write-Output "You selected Option 3."
      # Haz algo para la opción 3
    }
    4 {
      # Si el usuario selecciona la opción 4, establece $exit a $true para salir del bucle
      $exit = $true
    }
  }
}

Ahora, ejecuta el script (myoutput.ps1) desde el directorio de trabajo.

./myoutput.ps1

Como se muestra a continuación, se muestra el mensaje asociado con tu selección cuando eliges las opciones 1, 2, o 3. Pero cuando seleccionas la opción 4, el script termina.

Creating a menu system and input prompts

Mostrando una Pantalla de Bienvenida o Mensaje de Presentación

Además de enumerar las opciones que los usuarios pueden elegir, con Write-Output, también puedes mostrar una pantalla de presentación o un mensaje de bienvenida. Las pantallas de presentación elegantes dan una buena impresión (profesional y pulida) a tu script.

Reemplaza el código en tu archivo myoutput.ps1 con el siguiente, que muestra una pantalla de presentación (un banner de un mensaje de bienvenida) cuando ejecutas tu script.

Puedes personalizar la pantalla de presentación modificando el texto y el formato del banner. Puedes agregar elementos adicionales, como un logotipo o texto, a la pantalla de presentación según lo desees.

# Limpiar la pantalla
Clear-Host

# Mostrar la pantalla de presentación usando Write-Output
Write-Output "##############################################"
Write-Output "#                                            #"
Write-Output "#   Welcome to the SuperScript 3000!         #"
Write-Output "#                                            #"
Write-Output "##############################################"

Ahora, ejecuta el script y observa cómo se ve tu pantalla de presentación.

./myoutput.ps1
Displaying a splash screen or welcome message

Mostrar una barra de progreso

Cuando ejecutas scripts, un indicador de progreso elimina la ansiedad del usuario sobre si el script se está ejecutando o no. Las barras de progreso pueden ser útiles para indicar el progreso de un script o operación que lleva mucho tiempo al usuario. Afortunadamente, con el cmdlet Write-Output, puedes crear una barra de progreso a tu gusto.

Abre tu archivo myoutput.ps1 y agrega el siguiente código al final del existente en el archivo del script.

El código a continuación utiliza un bucle while para iterar a través de varios pasos. En este ejemplo, 100 pasos. Cada iteración del bucle calcula el porcentaje de pasos completados y muestra una barra de progreso usando Write-Output.

La barra de progreso se crea utilizando una combinación de los siguientes operadores:

  • * – Repite una cadena un número especificado de veces
  • $() – Permite que la salida de una expresión se incluya en una cadena.

El script luego se pausa (Start-Sleep) durante 1 segundo para simular el progreso antes de pasar al siguiente paso.

# Establece el número total de pasos para la barra de progreso
$steps = 100

# Inicializa el contador para el paso actual
$currentStep = 0

# Inicia un bucle que se ejecutará durante el número de pasos
while ($currentStep -lt $steps) {
  # Incrementa el contador del paso actual
  $currentStep++

  # Calcula el porcentaje de pasos completados
  $percentComplete = [int] ($currentStep / $steps * 100)

  # Muestra una barra de progreso usando Write-Output
  Write-Output "Progress: [$("=" * $percentComplete)$(" " * ($steps-$percentComplete))] $percentComplete% complete"

  # Pausa durante 1 segundo para simular el progreso
  Start-Sleep -Seconds 1
}

Ahora, ejecuta el script y observa cómo funciona la barra de progreso.

./myoutput.ps1

Abajo, puedes ver la pantalla de presentación junto con la barra de progreso.

Displaying a progress bar

Conclusión

En este tutorial, has visto cómo Write-Output puede fácilmente producir objetos, tipos de datos, y formatos personalizados. Además, has explorado el uso del operador de canalización para enviar la salida a otros comandos para su procesamiento adicional.

Ya sea que estés escribiendo un simple mensaje de salida o tareas de automatización complejas, Write-Output es una herramienta indispensable para crear scripts de PowerShell más informativos y profesionales.

Con este conocimiento recién adquirido, ¿por qué no escribir tus salidas en diferentes tipos de archivos, como archivos .txt y .xml? Independientemente de la intención, las copias de salida son útiles para solucionar problemas con tu sistema o aplicaciones. El Write-Output y el cmdlet Out-File te otorgan el poder que nunca supiste que necesitabas.

Source:
https://adamtheautomator.com/powershell-write-output/