PowerShell parte de una idea que replantea cincuenta años de tradición Unix: ¿y si por las tuberías viajaran objetos en lugar de texto? El resultado elimina de un golpe el análisis con expresiones regulares que domina el trabajo en Bash — y trae sus propias asperezas.
🎯 Por qué está en este programa
PowerShell es un primo de la familia históricos / shell (Atlas), junto a Bash y JCL.
Aporta al programa la alternativa al contrato de texto (clases 159 y 161): una tubería con datos estructurados y tipados, en lugar de con cadenas que hay que volver a analizar. Es la mejor demostración de que el formato de la frontera decide el trabajo que hay que hacer en los dos lados.
| Año | 2006; PowerShell Core 6 multiplataforma y libre (2018); 7.x actual |
| Autoría | Jeffrey Snover, Microsoft — a partir del Monad Manifesto (2002) |
| Familia | Históricos / shell; sobre .NET (C#) |
| Paradigma | Imperativo y de canalización, orientado a objetos |
| Tipado | Dinámico con tipos de .NET; con anotaciones opcionales |
| Memoria | La del CLR: recolección de basura |
| Ejecución | Interpretado sobre .NET, con compilación a IL de los bloques de guion |
| Estado | 🟢 Estándar en administración de Windows, Azure y Microsoft 365 |
En 2002, Jeffrey Snover escribió el Monad Manifesto, un documento que empieza con un diagnóstico incómodo para Microsoft: la administración de Windows por interfaz gráfica no escala, y el modelo de Unix —herramientas de texto compuestas por tuberías— no se puede copiar directamente.
Y la razón que daba es interesante: en Unix, la configuración está en ficheros de texto, así que
grep y sed bastan. En Windows, la configuración está en el registro, en WMI y en APIs de
objetos, y convertir eso a texto para volver a analizarlo pierde información y es frágil.
Su propuesta fue cambiar lo que viaja por la tubería:
Get-Process | Where-Object CPU -gt 100 | Sort-Object CPU -Descending | Select-Object -First 5
Ahí no viaja texto: viajan objetos Process, con sus propiedades y sus métodos. No hay que
analizar nada, porque CPU es un número y no una columna que haya que extraer.
PowerShell 1.0 salió en 2006, y su adopción fue lenta hasta que Microsoft tomó una decisión estratégica: exigir que todo producto de servidor expusiera su funcionalidad como cmdlets, y que la interfaz gráfica se construyera encima. Exchange fue el primero.
En 2016 se abrió el código y en 2018 llegó PowerShell Core, multiplataforma sobre .NET Core — que lo llevó a Linux y a macOS.
Az y Microsoft.Graph son la vía de automatización.La comparación con Bash es el contenido de esta ficha:
# Bash: TODO es texto, hay que extraer columnas y confiar en el formato
ps aux | awk '$3 > 50 {print $11}' | sort | head -5
# PowerShell: viajan objetos, se accede a propiedades con nombre
Get-Process | Where-Object CPU -gt 50 | Select-Object -First 5 -Property Name
Y las diferencias son de fondo:
| Texto (Bash) | Objetos (PowerShell) | |
|---|---|---|
| Extraer un dato | analizar con awk, cut, sed |
acceder a la propiedad |
| Si cambia el formato | se rompe en silencio | no hay formato que cambiar |
| Tipos | todo cadena; convertir a mano | DateTime, Int, FileInfo… |
| Interoperabilidad | universal: cualquier programa | dentro del ecosistema .NET |
| Rendimiento | procesos ligeros, texto barato | objetos y CLR: más pesado |
Y las dos últimas filas son el precio. El contrato de texto de Unix es universal: cualquier
programa, en cualquier lenguaje, de cualquier época, participa (clase 161). Los objetos de
PowerShell solo los entiende PowerShell — y al llamar a git o a docker, vuelve el texto.
Es exactamente la tensión de la clase 159: el formato que captura más información es el que menos gente entiende.
Y hay una segunda cosa que PowerShell hace notablemente bien: la coherencia.
Get-Process Get-Service Get-ChildItem Get-Content
Set-Location Remove-Item New-Item Start-Service
Todos los comandos son Verbo-Sustantivo, con una lista aprobada de verbos. Eso significa que
se puede adivinar el nombre de un comando que no se conoce — y Get-Verb la lista.
Es la misma virtud que la clase 167 señalaba en los comandos CL de IBM i: la consistencia hace que aprender uno sea aprender todos, frente a la libertad total de Unix donde cada herramienta inventa sus opciones.
&& y ||, operador ternario, ?? y paralelismo en
ForEach-Object -Parallel.SecretManagement: gestión de credenciales sin ponerlas en el guion (clase 153).ConvertTo-Json / ConvertFrom-Json, que son el puente al mundo del texto estructurado
(clase 159).pwsh main.ps1 # PowerShell 7, multiplataforma
powershell.exe -File main.ps1 # Windows PowerShell 5.1
Invoke-ScriptAnalyzer -Path main.ps1 # análisis (clase 146)
Invoke-Pester # pruebas (clase 139)
Esta versión se escribe aquí y no está verificada en CI (clase 040).
$campos = ($input | Select-Object -First 1) -split '\s+'
[double]$precio = $campos[0]
[double]$cantidad = $campos[1]
[double]$descuento = $campos[2]
$total = $precio * $cantidad * (1 - $descuento)
'Total: {0:F2}' -f $total
Lo que hay que ver.
[double]$precio es una conversión con tipo, no una anotación: PowerShell convierte y
comprueba, y falla si no puede. Es tipado dinámico con los tipos de .NET disponibles.-split '\s+' usa una expresión regular y devuelve un arreglo de verdad, no una cadena que
haya que volver a partir.-f es el operador de formato, y {0:F2} es el formato de .NET — el mismo F2 que en
C# y VB.NET (clase 157). Y con la misma advertencia: la cultura
regional afecta al separador decimal, así que en un guion serio conviene fijarla.Write-Output: el resultado de una expresión suelta va a la
tubería. Es una decisión del lenguaje que ahorra ceremonia y que despista al principio.Get-Help con
-Examples dentro del propio shell.⏮️ Volver al Atlas · 🗂️ Todas las fichas · 🔗 Relacionadas: Bash · C# · Tcl · JCL · Perl