En la primera parte definimos dos conceptos clave de PowerShell: la tubería y el objeto. En la segunda parte expliqué qué son los objetos y la tubería. En la tercera parte nos familiarizamos con el sistema de archivos y los proveedores.
Hoy veremos el trabajo interactivo con datos en la consola, así como las alertas y notificaciones.
- Trabajo interactivo con datos en la consola.
- Qué puede hacer
Out-ConsoleGridView: - Ejemplos de uso de
Out-ConsoleGridView- Uso básico: mostrar una tabla con la opción de selección interactiva. (casilla de verificación)
- Selección de una sola fila con devolución obligatoria del resultado. (radio)
- Filtrado y ordenación de grandes matrices
- **Gestión interactiva de procesos:**
- **Selección de archivos para archivar:**
- **Selección de un elemento para análisis detallado:**
- Ejemplo con título y sugerencias personalizados
- Información del sistema.
- Creación del cmdlet ‘Get-SystemMonitor’
- Resultado: Lo que obtiene
Trabajo interactivo con datos en la consola.
Out-ConsoleGridView. GUI en la consola de PowerShell.
❗ Importante: Todas las herramientas descritas a continuación requieren **PowerShell 7.2 o posterior.
Out-ConsoleGridView es una tabla interactiva, directamente en la consola de PowerShell, que permite: – ver datos en formato de tabla; – filtrar y ordenar columnas; – seleccionar filas con el cursor – para pasarlas por la tubería; – y mucho más.
Out-ConsoleGridView forma parte del módulo Microsoft.PowerShell.ConsoleGuiTools. Para usarlo, primero debe instalar este módulo.
Para instalar el módulo, ejecute el siguiente comando en PowerShell:
Install-Module Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser

Install-Module descarga e instala el módulo especificado desde el repositorio en el sistema. Análogos: pip install en Python o npm install en Node.js.
📎 Parámetros clave de Install-Module
| Parámetro | Descripción |
|---|---|
-Name | Nombre del módulo a instalar. |
-Scope | Ámbito de instalación: AllUsers (predeterminado, requiere derechos de administrador) o CurrentUser (no requiere derechos de administrador). |
-Repository | Especifica el repositorio, por ejemplo PSGallery. |
-Force | Instalación forzada sin confirmación. |
-AllowClobber | Permite sobrescribir comandos existentes. |
-AcceptLicense | Acepta automáticamente la licencia del módulo. |
-RequiredVersion | Instala una versión específica del módulo. |
Después de la instalación, puede pasar cualquier salida a Out-ConsoleGridView para un trabajo interactivo.
# Ejemplo clásico: mostrar una lista de procesos en una tabla interactiva
Get-Process | Out-ConsoleGridView
Interfaz:
- Filtrado: Simplemente comience a escribir texto, y la lista se filtrará sobre la marcha.
- Navegación: Use las teclas de flecha para moverse por la lista.
- Selección: Presione
Espaciopara seleccionar/deseleccionar un elemento. - Selección múltiple:
Ctrl+Apara seleccionar todos los elementos,Ctrl+Dpara deseleccionar todo. - Confirmación: Presione
Enterpara devolver los objetos seleccionados. - Cancelación: Presione
ESCpara cerrar la ventana sin devolver datos.
Qué puede hacer Out-ConsoleGridView:
- Mostrar datos tabulares directamente en la consola en forma de tabla interactiva con navegación por filas y columnas.
- Ordenar columnas presionando teclas.
- Filtrar datos usando la búsqueda.
- Seleccionar una o varias filas con devolución del resultado.
- Trabajar en una consola limpia sin ventanas
GUI. - Admitir una gran cantidad de filas con desplazamiento.
- Admitir varios tipos de datos (cadenas, números, fechas, etc.).
Ejemplos de uso de Out-ConsoleGridView
Uso básico: mostrar una tabla con la opción de selección interactiva. (casilla de verificación)
Import-Module Microsoft.PowerShell.ConsoleGuiTools
$data = Get-Process | Select-Object -First 30 -Property Id, ProcessName, CPU, WorkingSet
# Mostrar tabla con opciones de filtrado, ordenación y selección de filas
$selected = $data | Out-ConsoleGridView -Title "Select process(es)" -OutputMode Multiple
$selected | Format-Table -AutoSize
Se muestra una lista de procesos en una tabla interactiva de consola. Se puede filtrar por nombre, ordenar columnas y seleccionar procesos. Los procesos seleccionados se devuelven a la variable $selected.
Selección de una sola fila con devolución obligatoria del resultado. (radio)
$choice = Get-Service | Select-Object -First 20 | Out-ConsoleGridView -Title "Select a service" -OutputMode Single
Write-Host "You selected service: $($choice.Name)"
El usuario selecciona una sola fila (servicio). -OutputMode Single prohíbe seleccionar varias.
Filtrado y ordenación de grandes matrices
$data = 1..1000 | ForEach-Object {
[PSCustomObject]@{
Number = $_
Square = $_ * $_
Cube = $_ * $_ * $_
}
}
$data | Out-ConsoleGridView -Title "Numbers and powers" -OutputMode Multiple
Muestra una tabla de 1000 filas con números y sus potencias.
**Gestión interactiva de procesos:**
Puede seleccionar varios procesos para detener. El parámetro -OutputMode Multiple indica que queremos devolver todos los elementos seleccionados.
# Pasar los resultados por la tubería.
# Detener los procesos seleccionados con el parámetro -WhatIf para una vista previa.
# Para ello, definiremos la variable $procsToStop
$procsToStop = Get-Process | Out-ConsoleGridView -OutputMode Multiple
# Si se seleccionó algo, pasar los objetos por la tubería
if ($procsToStop) {
$procsToStop | Stop-Process -WhatIf
}
**Selección de archivos para archivar:**
Encontraremos todos los archivos .log en la carpeta, seleccionaremos los necesarios y crearemos un archivo a partir de ellos.
$filesToArchive = Get-ChildItem -Path C:\Logs -Filter "*.log" -Recurse | Out-ConsoleGridView -OutputMode Multiple
❗ Tenga cuidado con la recursión
if ($filesToArchive) {
Compress-Archive -Path $filesToArchive.FullName -DestinationPath C:\Temp\LogArchive.zip
# Agregar un mensaje de éxito
Write-Host "✅ ¡Archivado completado con éxito!" -ForegroundColor Green
}
**Selección de un elemento para análisis detallado:**
Patrón «Drill-Down» — de una lista general a detalles con Out-ConsoleGridView
A menudo, al trabajar con objetos del sistema, nos enfrentamos a un dilema:
- Si solicitamos **todas las propiedades** para **todos los objetos** (
Get-NetAdapter | Format-List *), la salida será enorme e ilegible. - Si mostramos una **tabla concisa**, perderemos detalles importantes.
- A veces, intentar obtener todos los datos a la vez puede provocar un error si uno de los objetos contiene valores incorrectos.
La solución a este problema es el patrón **»Drill-Down»** (detallado o «profundización»). Su esencia es simple:
- Paso 1 (Resumen): Mostrar al usuario una lista de elementos limpia, concisa y segura para la **selección**.
- Paso 2 (Detalle): Una vez que el usuario ha seleccionado un elemento específico, mostrarle **toda la información disponible** sobre ese elemento.
Ejemplo práctico: Creación de un explorador de adaptadores de red
Implementaremos este patrón usando el comando Get-NetAdapter.
Tarea: Primero, mostrar una lista concisa de adaptadores de red. Después de seleccionar uno, abrir una segunda ventana con todas sus propiedades.
Código listo para usar:
# --- Etapa 1: Selección del adaptador de la lista concisa ---
$adapterList = Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed
$selectedAdapter = $adapterList | Out-ConsoleGridView -Title "ETAPA 1: Seleccione un adaptador de red"
# --- Etapa 2: Mostrar información detallada o mensaje de cancelación ---
if ($null -ne $selectedAdapter) {
# Obtener TODAS las propiedades para el adaptador SELECCIONADO
$detailedInfoObject = Get-NetAdapter -Name $selectedAdapter.Name | Select-Object *
# Usar nuestro truco con .psobject.Properties para transformar el objeto en una tabla conveniente "Nombre-Valor"
$detailedInfoForGrid = $detailedInfoObject.psobject.Properties | Select-Object Name, Value
# Abrir la SEGUNDA ventana GridView con la información completa
$detailedInfoForGrid | Out-ConsoleGridView -Title "ETAPA 2: Información completa sobre '$($selectedAdapter.Name)'"
} else {
Write-Host "Operación cancelada. No se seleccionó ningún adaptador." -ForegroundColor Yellow
}
Desglose paso a paso
- Creación de una lista «segura»:
$adapterList = Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeedNo pasamos la salida deGet-NetAdapterdirectamente. En su lugar, creamos nuevos objetos «limpios» usandoSelect-Object, incluyendo solo las propiedades que necesitamos para la descripción general. Esto garantiza que los datos problemáticos que causaron el error serán descartados. - Primera ventana interactiva:
$selectedAdapter = $adapterList | Out-ConsoleGridView ...El script muestra la primera ventana y **detiene su ejecución**, esperando su selección. Tan pronto como seleccione una fila y presioneEnter, el objeto correspondiente a esa fila se escribirá en la variable$selectedAdapter. - Verificación de la selección:
if ($null -ne $selectedAdapter)Esta es una verificación críticamente importante. Si el usuario presionaEsco cierra la ventana, la variable$selectedAdapterestará vacía ($null). Esta verificación evita que el resto del código se ejecute y que ocurran errores. - Obtención de información completa:
$detailedInfoObject = Get-NetAdapter -Name $selectedAdapter.NameAquí está el punto clave del patrón. Volvemos a llamar aGet-NetAdapter, pero esta vez solicitamos **solo un** objeto por su nombre, que tomamos del elemento seleccionado en la primera etapa. Ahora obtenemos el objeto completo con todas sus propiedades. - Transformación para la segunda ventana:
$detailedInfoForGrid = $detailedInfoObject.psobject.Properties | ...Usamos el potente truco que ya conoce para «desplegar» este objeto complejo único en una larga lista de pares «Nombre de propiedad» | «Valor», lo que es ideal para mostrar en una tabla. - Segunda ventana interactiva:
$detailedInfoForGrid | Out-ConsoleGridView ...Aparece una segunda ventana en la pantalla, esta vez con información exhaustiva sobre el adaptador que seleccionó.
Ejemplo con título y sugerencias personalizados
Mostrar el registro de eventos de Windows en una tabla interactiva con el título «System Events».
Get-EventLog -LogName System -Newest 50 |
Select-Object TimeGenerated, EntryType, Source, Message |
Out-ConsoleGridView -Title "System Events" -OutputMode Multiple
Este código obtiene los 50 eventos más recientes del registro del sistema de Windows, selecciona solo cuatro propiedades clave de cada evento (tiempo, tipo, origen y mensaje) y los muestra en la ventana Out-ConsoleGridView.
Información del sistema.
código del script para obtener información del sistema: Get-SystemMonitor.ps1
Creación del cmdlet ‘Get-SystemMonitor’
Paso 1: Configuración de la variable PATH
- Cree una carpeta permanente para sus herramientas, si aún no lo ha hecho. Por ejemplo:
C:\PowerShell\Scripts - Coloque su archivo
Get-SystemMonitor.ps1en esta carpeta. - Agregue esta carpeta a la variable del sistema
PATH,
Paso 2: Configuración del alias en el perfil de PowerShell
Ahora que el sistema sabe dónde encontrar su script por su nombre completo, podemos crear un alias corto para él.
- Abra su archivo de perfil de
PowerShell:
notepad $PROFILE
- Agregue la siguiente línea:
# Alias para el monitor del sistema
Set-Alias -Name sysmon -Value "Get-SystemMonitor.ps1"
Tenga en cuenta el punto clave: Dado que la carpeta con el script ya está en PATH, ¡ya **no necesitamos especificar la ruta completa** al archivo! Simplemente nos referimos a su nombre. Esto hace que su perfil sea más limpio y confiable. Si alguna vez mueve la carpeta C:\PowerShell\Scripts, solo necesitará actualizar la variable PATH, y su archivo de perfil permanecerá sin cambios.
Reinicie PowerShell
Cierre **todas** las ventanas de PowerShell abiertas y abra una nueva. Esto es necesario para que el sistema aplique los cambios tanto en la variable PATH como en su perfil.
Resultado: Lo que obtiene
Después de realizar estos pasos, podrá llamar a su script **de dos maneras desde cualquier lugar del sistema**:
- Por nombre completo (confiable, para usar en otros scripts):
Get-SystemMonitor.ps1 Get-SystemMonitor.ps1 -Resource storage - Por alias corto (conveniente, para trabajo interactivo):
sysmon symon -Resource memory
Ha «registrado» con éxito su script en el sistema de la manera más profesional y flexible.
¿Útil? Suscríbase. ¿Le gustó? — ponga «+» ¡Buena suerte! 🚀
Otros artículos sobre PowerShell: