n8n + PowerShell: Automatiza Tareas de Administración sin Escribir Código


Si ya conoces n8n como herramienta de automatización y también manejas PowerShell para administrar sistemas Windows, combinarlos es el siguiente nivel. En este artículo veremos cómo usar n8n para orquestar scripts de PowerShell de forma visual, programada y sin intervención manual.


¿Por qué combinar n8n con PowerShell?

n8n es una plataforma de automatización de flujos de trabajo open source (ya hablamos de sus agentes IA en un artículo anterior). PowerShell es el lenguaje de scripting por excelencia en entornos Windows. Juntos permiten:

  • Ejecutar scripts de forma programada sin depender del Programador de tareas de Windows
  • Encadenar acciones: ejecutar un script, procesar su salida y enviar el resultado por email o Slack
  • Centralizar la automatización de múltiples servidores desde un único panel
  • Añadir condiciones y bifurcaciones visuales sin tocar el código PowerShell

Instalación rápida de n8n (si aún no lo tienes)

La forma más sencilla es con Docker:

docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n

O con npm si prefieres instalación directa:

npm install n8n -g
n8n start

Accede desde el navegador en http://localhost:5678.


Nodo Execute Command: el puente con PowerShell

n8n incluye el nodo Execute Command que permite ejecutar comandos del sistema operativo directamente. Para PowerShell:

Configuración básica del nodo

En el campo Command del nodo, escribe:

powershell.exe -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\mi-script.ps1"

O para comandos cortos directamente inline:

powershell.exe -Command "Get-Service | Where-Object {$_.Status -eq 'Stopped'} | ConvertTo-Json"

Tip: Usa -NonInteractive siempre en automatizaciones para evitar que el script quede bloqueado esperando input del usuario.


Flujo práctico 1: Informe diario de servicios detenidos

Este flujo ejecuta un script cada mañana, detecta servicios detenidos en el servidor y envía un email con el informe.

Nodos del flujo:

1. Cron → Se dispara cada día a las 7:00

2. Execute Command → Ejecuta el script PowerShell

3. IF → Comprueba si hay servicios detenidos

4. Send Email (Gmail/SMTP) → Envía el informe solo si hay problemas

Script PowerShell (check-services.ps1):

$serviciosDetenidos = Get-Service | Where-Object {
$_.StartType -eq "Automatic" -and $_.Status -eq "Stopped"
}

if ($serviciosDetenidos.Count -gt 0) {
$resultado = $serviciosDetenidos | Select-Object Name, DisplayName, Status |
ConvertTo-Json -Compress
Write-Output $resultado
} else {
Write-Output '{"ok": true, "message": "Todos los servicios automáticos están activos"}'
}

En n8n, la salida del script llega como JSON y puedes acceder a sus campos con {{ $json.Name }} en los nodos siguientes.


Flujo práctico 2: Limpieza automática de archivos temporales

Flujo:

1. Cron → Cada domingo a las 2:00 AM

2. Execute Command → Script de limpieza

3. HTTP Request → Notifica a un webhook de Slack o Teams

Script PowerShell (cleanup.ps1):

param(
[string]$RutaTemp = "C:\Windows\Temp",
[int]$DiasAntiguedad = 7
)

$fecha = (Get-Date).AddDays(-$DiasAntiguedad)
$archivos = Get-ChildItem -Path $RutaTemp -Recurse -ErrorAction SilentlyContinue |
Where-Object { !$_.PSIsContainer -and $_.LastWriteTime -lt $fecha }

$totalMB = [math]::Round(($archivos | Measure-Object -Property Length -Sum).Sum / 1MB, 2)
$archivos | Remove-Item -Force -ErrorAction SilentlyContinue

@{
archivosEliminados = $archivos.Count
espacioLiberadoMB  = $totalMB
fecha              = (Get-Date -Format "yyyy-MM-dd HH:mm")
} | ConvertTo-Json

n8n recibe el JSON con el número de archivos eliminados y el espacio liberado, y lo envía como notificación.


Flujo práctico 3: Trigger por evento (webhook)

También puedes lanzar scripts PowerShell bajo demanda desde cualquier sistema externo usando el nodo Webhook de n8n:

1. Webhook → Recibe una petición POST con {"servidor": "SRV01", "accion": "reiniciar-servicio", "servicio": "Spooler"}

2. Execute Command → Ejecuta el script con los parámetros recibidos

3. Respond to Webhook → Devuelve el resultado

param([string]$Servicio)
Restart-Service -Name $Servicio -Force
$estado = (Get-Service -Name $Servicio).Status
Write-Output "{"servicio": "$Servicio", "estado": "$estado"}"

Así cualquier sistema (Zabbix, Grafana, una app web) puede disparar acciones en tus servidores Windows de forma controlada y auditada.


Seguridad y buenas prácticas

  • Ejecuta n8n en una red interna o tras autenticación si vas a exponer webhooks
  • Usa cuentas de servicio con permisos mínimos para ejecutar los scripts, no el administrador
  • Registra la salida de cada ejecución en n8n: el historial de ejecuciones guarda inputs y outputs automáticamente
  • Valida los parámetros de entrada en los scripts antes de usarlos en comandos para evitar inyecciones

Conclusión

La combinación de n8n y PowerShell elimina la fricción entre la automatización visual y la potencia de scripting de Windows. Puedes monitorizar servidores, lanzar tareas de mantenimiento, responder a eventos y recibir notificaciones, todo desde un flujo visual sin necesidad de programar schedulers complejos ni depender exclusivamente del Programador de tareas.

Si ya tienes n8n corriendo en tu entorno, el siguiente paso es identificar qué scripts de PowerShell ejecutas manualmente de forma repetitiva: esos son tus mejores candidatos para automatizar hoy mismo.


¿Tienes algún flujo de n8n + PowerShell que uses en producción? Compártelo en los comentarios.

Deja una respuesta

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