Saltar al contenido

La Filosofía de PowerShell. Parte 0, 1

  • hypo69 

La Filosofía de PowerShell.

Parte 0.

¿Qué había antes de PowerShell? En 1981, se lanzó MS-DOS 1.0 con el intérprete de comandos COMMAND.COM. Para la automatización de tareas, se utilizaban archivos por lotes (.bat), simples archivos de texto con una secuencia de comandos de consola. Este fue un ascetismo sorprendente en la línea de comandos en comparación con los sistemas compatibles con POSIX, donde el shell Bourne (sh) existía desde 1979.

📅 Estado del mercado de los shells en el momento del lanzamiento de MS-DOS 1.0 (agosto de 1981)

Aquí hay una tabla resumen de los sistemas operativos populares de la época y su compatibilidad con los shells (sh, csh, etc.):

Sistema operativoCompatibilidad con shells (sh, csh, etc.)Comentario
UNIX Versión 7 (V7)shEl último UNIX clásico de Bell Labs, muy extendido
UNIX/32Vsh, cshVersión de UNIX para la arquitectura VAX
4BSD / 3BSDsh, cshRama universitaria de UNIX de Berkeley
UNIX System IIIshLa primera versión comercial de AT&T, predecesora de System V
Xenix (de Microsoft)shUna versión con licencia de UNIX, vendida por Microsoft desde 1980
IDRISshUn sistema operativo similar a UNIX para PDP-11 e Intel
Coherent (Mark Williams)sh (similar)Una alternativa económica a UNIX para PC
CP/M (Digital Research)❌ (Sin sh, solo una CLI muy básica)No es UNIX, el sistema operativo más popular para PC de 8 bits
MS-DOS 1.0❌ (solo COMMAND.COM)Shell de comandos mínimo, sin scripts ni tuberías

💡 ¿Qué son sh, csh?

  • shBourne Shell, el principal intérprete de scripts de UNIX desde 1977.
  • cshC Shell, un shell mejorado con una sintaxis similar a la de C y comodidades para el trabajo interactivo.
  • Estos shells admitían redirecciones, tuberías, variables, funciones y condiciones, todo lo que convirtió a UNIX en una potente herramienta de automatización.

Microsoft se centró en los PC IBM de 16 bits baratos, que tenían poca memoria (normalmente entre 64 y 256 KB), carecían de multitarea y estaban pensados para uso doméstico y de oficina, no para servidores. UNIX era caro, requería una arquitectura y unos conocimientos complejos, mientras que los contables e ingenieros, que no eran administradores de sistemas, necesitaban un sistema operativo rápido y sencillo.

En lugar del complejo sh, la interfaz de DOS proporcionaba un único archivo, command.com, con un escaso conjunto de comandos internos [ (dir, copy, del, etc.)](dir, copy, del, etc.) sin funciones, bucles ni módulos.

También había comandos externos: archivos ejecutables independientes (.exe o .com). Ejemplos: FORMAT.COM, XCOPY.EXE, CHKDSK.EXE, EDIT.COM. Los scripts de ejecución se escribían en un archivo de texto con la extensión .bat (archivo por lotes).

Ejemplos de archivos de configuración:

  • AUTOEXEC.BAT
:: ------------------------------------------------------------------------------
:: AUTOEXEC.BAT — Configuración y arranque automáticos de Windows 3.11
:: Autor: hypo69
:: Año: aproximadamente 1993
:: Propósito: Inicializa el entorno DOS, carga los controladores de red e inicia Windows 3.11
:: ------------------------------------------------------------------------------
@ECHO OFF

:: Establecer el símbolo del sistema
PROMPT $p$g

:: Establecer variables de entorno
SET TEMP=C:\TEMP
PATH=C:\DOS;C:\WINDOWS

:: Cargar controladores y utilidades en la memoria alta
LH C:\DOS\SMARTDRV.EXE       :: Caché de disco
LH C:\DOS\MOUSE.COM          :: Controlador del ratón

:: Cargar servicios de red (relevante para Windows para Trabajo en Grupo 3.11)
IF EXIST C:\NET\NET.EXE LH C:\NET\NET START

:: Iniciar Windows automáticamente
WIN
  • CONFIG.SYS
:: ------------------------------------------------------------------------------
:: CONFIG.SYS — Configuración de la memoria y los controladores de DOS para Windows 3.11
:: Autor: hypo69
:: Año: aproximadamente 1993
:: Propósito: Inicializa los controladores de memoria, configura los parámetros del sistema
:: ------------------------------------------------------------------------------
DEVICE=C:\DOS\HIMEM.SYS
DEVICE=C:\DOS\EMM386.EXE NOEMS
DOS=HIGH,UMB
FILES=40
BUFFERS=30
DEVICEHIGH=C:\DOS\SETVER.EXE

Paralelamente a DOS, Microsoft comenzó a desarrollar casi de inmediato un núcleo fundamentalmente nuevo.

El núcleo Windows NT (Nueva Tecnología) apareció por primera vez con el lanzamiento del sistema operativo:

Windows NT 3.1 — 27 de julio de 1993


  • El desarrollo comenzó: en 1988 bajo la dirección de Dave Cutler (un exingeniero de DEC y creador de VMS) con el objetivo de crear un sistema operativo completamente nuevo, seguro, portátil y multitarea, no compatible con MS-DOS a nivel de núcleo.
  • NT 3.1: se llamó así para enfatizar la compatibilidad con Windows 3.1 a nivel de interfaz, pero era una arquitectura completamente nueva.

🧠 Lo que aportó el núcleo NT:

CaracterísticaDescripción
Arquitectura de 32 bitsA diferencia de MS-DOS y Windows 3.x, que eran de 16 bits.
MultitareaVerdadera multitarea apropiativa.
Memoria protegidaLos programas no podían dañar la memoria de los demás.
ModularidadArquitectura del núcleo de varias capas: HAL, Ejecutivo, Núcleo, controladores.
Compatibilidad con multiplataformaNT 3.1 se ejecutaba en x86, MIPS y Alpha.
Compatibilidad con POSIXNT venía con un subsistema POSIX, certificado según POSIX.1.

📜 El linaje de NT:

Versión de NTAñoComentario
NT 3.11993Primer lanzamiento de NT
NT 3.5 / 3.511994–1995Mejoras, optimización
NT 4.01996Interfaz de Windows 95, pero núcleo de NT
Windows 20002000NT 5.0
Windows XP2001NT 5.1
Windows Vista2007NT 6.0
Windows 102015NT 10.0
Windows 112021También NT 10.0 (marketing 😊)

Diferencia en las capacidades del sistema operativo:

CaracterísticaMS-DOS (1981)Windows NT (1993)
Tipo de sistemaMonolítico, monotareaMicronúcleo/híbrido, multitarea
Arquitectura16 bits32 bits (con compatibilidad con 64 bits desde NT 5.2 / XP x64)
Multitarea❌ Ausente (un proceso a la vez)✅ Multitarea apropiativa
Memoria protegida❌ No✅ Sí (cada proceso en su propio espacio de direcciones)
Modo multiusuario❌ No✅ Parcialmente (en NT Workstation/Server)
Compatibilidad con POSIX❌ No✅ Subsistema POSIX integrado en NT 3.1–5.2
Portabilidad del núcleo❌ Solo x86✅ x86, MIPS, Alpha, PowerPC
ControladoresAcceso directo al hardwareA través de HAL y controladores en modo núcleo
Nivel de acceso de las aplicacionesAplicaciones = nivel de sistemaNiveles de usuario/núcleo separados
Seguridad❌ Ausente✅ Modelo de seguridad: SID, ACL, tokens de acceso
Estabilidad❌ La dependencia de un programa = fallo del sistema operativo✅ Aislamiento de procesos, protección del núcleo

¡Pero había un gran PERO! No se prestó la debida atención a las herramientas de automatización y administración hasta 2002.


Microsoft utilizó enfoques, estrategias y herramientas completamente diferentes para la administración. Todo esto era disperso, a menudo orientado a la GUI y no siempre automatizable.


📌 Lista de algunas herramientas:
HerramientaPropósito
cmd.exeIntérprete de comandos mejorado (reemplazo de COMMAND.COM)
.bat, .cmdScripts de línea de comandos
Windows Script Host (WSH)Compatibilidad con VBScript y JScript para la automatización
reg.exeAdministrar el registro desde la línea de comandos
net.exeTrabajar con usuarios, redes, impresoras
sc.exeAdministrar servicios
tasklist, taskkillAdministrar procesos
gpedit.mscDirectiva de grupo (local)
MMCConsola con complementos para la administración
WMIAcceder a la información del sistema (a través de wmic, VBScript o COM)
WbemTest.exeGUI para probar consultas WMI
eventvwrVer registros de eventos
perfmonSupervisar recursos
🛠 Ejemplos de automatización:
  • Archivos VBScript (*.vbs) para administrar usuarios, redes, impresoras y servicios.
  • WMIC: interfaz de línea de comandos para WMI (p. ej.: wmic process list brief).
  • Scripts .cmd con llamadas a net, sc, reg, wmic, etc.

⚙️ Windows Scripting Host (WSH)

  • Apareció por primera vez en Windows 98, se utilizó activamente en Windows 2000 y XP.
  • Permitía ejecutar archivos VBScript y JScript desde la línea de comandos:
  Set objShell = WScript.CreateObject("WScript.Shell")
  objShell.Run "notepad.exe"

Parte 1.

Solo en 2002 la empresa formuló el proyecto Monad, que más tarde se convirtió en PowerShell:

Inicio del desarrollo: aproximadamente en 2002

Anuncio público: 2003, como «Monad Shell»

Primeras versiones beta: aparecieron en 2005

Lanzamiento final (PowerShell 1.0): noviembre de 2006

El autor y arquitecto jefe del proyecto Monad / PowerShell es Jeffrey Snover (Jeffrey Snover)

Hoy en día, PowerShell Core se ejecuta en Windows macOS Linux

Paralelamente, se estaba desarrollando el framework .NET y PowerShell estaba profundamente integrado en él. En los próximos capítulos, mostraré ejemplos.

¡Y ahora, lo más importante!

La principal ventaja de PowerShell en comparación con los shells de comandos clásicos es que funciona con objetos, no con texto. Cuando se ejecuta un comando, no devuelve solo texto, sino un objeto estructurado (o una colección de objetos) que tiene propiedades y métodos claramente definidos.

Vea cómo PowerShell supera a los shells clásicos gracias al trabajo con objetos

📁 La forma antigua: dir y el análisis manual

En CMD (tanto en el antiguo COMMAND.COM como en cmd.exe`), el comando dir devuelve el resultado como texto sin formato. Salida de ejemplo:

24.07.2025  21:15         1.428  my_script.js
25.07.2025  08:01         3.980  report.html

Supongamos que desea extraer el nombre del archivo y el tamaño de cada archivo. Tendría que analizar las cadenas manualmente:

for /f "tokens=5,6" %a in ('dir ^| findstr /R "[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]"') do @echo %a %b
  • Esto es terriblemente difícil de leer, depende de la configuración regional, el formato de la fecha y la fuente. Y se rompe con los espacios en los nombres.

✅ PowerShell: objetos en lugar de texto

✔ Ejemplo simple y legible:

Get-ChildItem | Select-Object Name, Length

Resultado:

Name          Length
----          ------
my_script.js   1428
report.html    3980
  • Get-ChildItem devuelve una matriz de objetos de archivo/carpeta
  • Select-Object le permite obtener fácilmente las propiedades requeridas

🔍 ¿Qué devuelve realmente Get-ChildItem?

$item = Get-ChildItem -Path .\my_script.js
$item | Get-Member

Resultado:

TypeName: System.IO.FileInfo

Name         MemberType     Definition
----         ---------      ----------
Length       Property       long Length {get;}
Name         Property       string Name {get;}
CreationTime Property       datetime CreationTime {get;set;}
Delete       Method         void Delete()
...

PowerShell devuelve objetos System.IO.FileInfo, que tienen:

  • 🧱 Propiedades (Name, Length, CreationTime, Extension, …)
  • 🛠 Métodos (Delete(), CopyTo(), MoveTo(), etc.)

Usted trabaja con objetos completos, no con cadenas.


Sintaxis «Verbo-Sustantivo»:

PowerShell utiliza una sintaxis de comandos estricta y lógica: Verbo-Sustantivo

VerboQué hace
Get-Obtener
Set-Establecer
New-Crear
Remove-Eliminar
Start-Iniciar
Stop-Detener
SustantivoSobre qué funciona
ProcessProceso
ServiceServicio
ItemArchivo/carpeta
EventLogRegistros de eventos
ComputerOrdenador

🔄 Ejemplos:

Qué hacerComando
Obtener procesosGet-Process
Detener un servicioStop-Service
Crear un nuevo archivoNew-Item
Obtener el contenido de la carpetaGet-ChildItem
Eliminar un archivoRemove-Item

➡ Incluso si no conoce el comando exacto, puede adivinarlo por el significado, y casi siempre acertará.


El cmdlet Get-Help es su principal ayudante.

  1. Obtener ayuda sobre la propia ayuda: Get-Help Get-Help
  2. Obtener ayuda básica sobre el comando para trabajar con procesos: Get-Help Get-Process
  3. Ver ejemplos de uso de este comando: Get-Help Get-Process -Examples Este es un parámetro increíblemente útil que a menudo proporciona soluciones listas para usar para sus tareas.
  4. Obtener la información más detallada sobre el comando: Get-Help Get-Process -Full

En la siguiente parte: la canalización o cadena de comandos (PipeLines)

Deja una respuesta

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