Contenidos
1. Las bases de PowerShell
El vínculo entre PowerShell y .NET
PowerShell está profundamente integrado con .NET, lo que lo convierte en una herramienta extremadamente poderosa para interactuar con el sistema operativo y otros recursos. Esta integración permite acceder a clases, métodos y propiedades de .NET directamente desde PowerShell, ofreciendo un control avanzado sobre diversas operaciones.
Por ejemplo, se puede utilizar la clase DateTime
de .NET para obtener información sobre la fecha y hora actuales:
1 2 |
# Crear un objeto DateTime de .NET y mostrar la fecha y hora actuales [DateTime]::Now |
También puedes usar objetos más avanzados como System.IO
para trabajar con archivos:
1 2 |
# Leer el contenido de un archivo usando una clase de .NET [System.IO.File]::ReadAllText("C:\example.txt") |
Cmdlets: principio y uso
Los cmdlets son comandos predefinidos diseñados para realizar tareas específicas. Están escritos en .NET y ofrecen una sintaxis simple para interactuar con el sistema. Los cmdlets tienen un formato estándar de verbo-sustantivo, como Get-Process
(obtener procesos) o Set-Item
(configurar un elemento).
1 2 3 4 5 |
# Obtener una lista de procesos en ejecución Get-Process # Detener un proceso específico por su nombre Stop-Process -Name "notepad" |
Tuberías
La tubería en PowerShell permite encadenar cmdlets, de forma que la salida de un comando se convierte en la entrada de otro. Esto simplifica la creación de flujos de trabajo complejos.
1 2 3 4 5 |
# Listar servicios y filtrar los que están detenidos Get-Service | Where-Object { $_.Status -eq "Stopped" } # Contar la cantidad de procesos en ejecución Get-Process | Measure-Object |
La variable $PipelineVariable
se puede usar para almacenar temporalmente datos intermedios dentro de la tubería:
1 2 3 4 |
# Usar $PipelineVariable para acceder a datos intermedios Get-Process | ForEach-Object -PipelineVariable process { "Proceso: $process.Name, Memoria: $($process.WorkingSet / 1MB) MB" } |
Filtros y bucles
PowerShell incluye filtros como Where-Object
para evaluar condiciones y bucles como ForEach-Object
para iterar sobre colecciones.
1 2 3 4 5 6 7 |
# Filtrar archivos mayores a 5 MB Get-ChildItem -Path C:\Logs | Where-Object { $_.Length -gt 5MB } # Iterar sobre los servicios en ejecución Get-Service | ForEach-Object { "Servicio: $($_.Name), Estado: $($_.Status)" } |
Windows ISE
El entorno integrado de scripts (ISE) de PowerShell es una herramienta poderosa para escribir, depurar y ejecutar scripts. Ofrece características como:
- Coloreado de sintaxis.
- Finalización automática de comandos.
- Ventanas múltiples para trabajar con diferentes scripts a la vez.
Puedes abrir el ISE ejecutando:
1 |
powershell_ise |
2. Tipos y operadores
Sistema de clasificación
En PowerShell, las variables pueden almacenar datos de diferentes tipos sin necesidad de declarar el tipo explícitamente. Sin embargo, puedes definir el tipo si lo deseas:
1 2 3 4 5 6 |
# Variable sin tipo explícito $miVariable = "Texto" # Variable con tipo explícito [string]$miCadena = "Esto es un string" [int]$miNumero = 42 |
El sistema de clasificación incluye tipos como:
[string]
: Cadenas de texto.[int]
: Números enteros.[datetime]
: Fechas y horas.[array]
: Listas o colecciones.
Expresiones regulares
PowerShell soporta expresiones regulares para buscar patrones en texto. Ejemplo:
1 2 |
# Verificar si una cadena contiene un número "Texto123" -match "\d+" |
Usar expresiones regulares para reemplazar texto:
1 2 |
# Reemplazar todas las vocales en una cadena "Hola Mundo" -replace "[aeiou]", "*" |
Operadores
PowerShell incluye diversos operadores para realizar operaciones matemáticas, comparaciones y manipulaciones de texto:
- Aritméticos:
+, -, *, /
- Comparación:
-eq, -ne, -gt, -lt, -like
- Lógicos:
-and, -or, -not
1 2 3 4 |
# Ejemplo de comparación if (5 -gt 3) { "5 es mayor que 3" } |
3. Estructuras de control y funciones
Estructuras de control
Las estructuras de control en PowerShell permiten gestionar el flujo del script según condiciones:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Condicional if-else if (Test-Path "C:\Archivo.txt") { "El archivo existe" } else { "El archivo no existe" } # Bucle While $count = 0 while ($count -lt 5) { "Contador: $count" $count++ } |
Funciones
Las funciones en PowerShell encapsulan lógica reutilizable:
1 2 3 4 5 6 7 8 |
# Función básica function Sumar-Numeros { param ([int]$a, [int]$b) return $a + $b } # Llamar a la función Sumar-Numeros -a 5 -b 10 |
4. Utilización de cmdlets y módulos
Gestión de archivos
PowerShell facilita la gestión de archivos mediante cmdlets especializados como Compress-Archive
y Expand-Archive
, que permiten comprimir y descomprimir archivos directamente.
1 2 3 4 5 |
# Comprimir un directorio Compress-Archive -Path C:\Data -DestinationPath C:\Backup.zip # Descomprimir un archivo Expand-Archive -Path C:\Backup.zip -DestinationPath C:\DataRestaurada |
Cmdlets para web
Cmdlets como Invoke-WebRequest
e Invoke-RestMethod
son ideales para interactuar con servicios web, descargar archivos y trabajar con APIs REST.
1 2 3 4 5 |
# Descargar una página web Invoke-WebRequest -Uri "https://example.com" -OutFile "response.html" # Consumir una API REST Invoke-RestMethod -Uri "https://api.example.com/data" -Method Get |
Ejemplo práctico
Un ejemplo práctico de recuperación de un canal RSS:
1 2 |
# Recuperar contenido de un feed RSS Invoke-WebRequest -Uri "https://example.com/rss" | Select-Object -ExpandProperty Content |
5. Utilización de objetos CIM
Métodos y propiedades WMI
PowerShell permite interactuar con objetos CIM (Common Information Model) para obtener información y realizar configuraciones en el sistema operativo. Por ejemplo, puedes usar Get-CimInstance
para consultar clases WMI:
1 2 |
# Verificar el estado del servicio WinRM Get-CimInstance -ClassName Win32_Service | Where-Object { $_.Name -eq "WinRM" } |
Comparar Get-CimInstance
con el cmdlet más antiguo Get-WmiObject
:
1 2 3 4 5 |
# Listar procesos usando CIM Get-CimInstance -ClassName Win32_Process # Usando el cmdlet antiguo Get-WmiObject -Class Win32_Process |
6. Uso de .NET y COM
Clases de .NET
PowerShell permite utilizar clases .NET directamente para realizar operaciones avanzadas, como pings y autenticación.
1 2 |
# Realizar un ping a un servidor (New-Object Net.NetworkInformation.Ping).Send("google.com") |
Interfaces gráficas
PowerShell puede usar XAML para crear interfaces gráficas simples. Ejemplo básico:
1 2 |
Add-Type -AssemblyName PresentationFramework [System.Windows.MessageBox]::Show("Hola, PowerShell!") |
Ejemplo práctico
Crear un formulario utilizando XAML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Formulario básico con XAML [xml]$xaml = @" <window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <grid> <button Content="Click Me" Width="100" Height="50"></button> </grid> </window> "@ Add-Type -AssemblyName PresentationFramework $reader = New-Object System.Xml.XmlNodeReader $xaml $window = [System.Windows.Markup.XamlReader]::Load($reader) $window.ShowDialog() |
7. Gestión de módulos y paquetes de PowerShell
Funcionamiento de módulos
Los módulos en PowerShell son colecciones de cmdlets, funciones, variables y recursos que permiten extender sus capacidades. Para trabajar con módulos:
1 2 3 4 5 6 7 8 |
# Listar módulos disponibles Get-Module -ListAvailable # Importar un módulo Import-Module ActiveDirectory # Encontrar e instalar un módulo desde PSGallery Find-Module -Name Az | Install-Module |
Ejemplo práctico
Crear un usuario en Active Directory:
1 2 |
# Crear un nuevo usuario en AD New-ADUser -Name "Juan Perez" -GivenName "Juan" -Surname "Perez" -SamAccountName "jperez" -UserPrincipalName "[email protected]" -Path "OU=Usuarios,DC=example,DC=com" -AccountPassword (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force) -Enabled $true |
8. Los objetos COM
Introducción a los objetos COM
Los objetos COM (Component Object Model) permiten interactuar con aplicaciones de Windows como Excel, Word y PowerPoint. Ejemplo de creación y manipulación de un libro de Excel:
1 2 3 4 5 6 |
# Crear un nuevo libro de Excel y escribir datos $excel = New-Object -ComObject Excel.Application $excel.Visible = $true $workbook = $excel.Workbooks.Add() $sheet = $workbook.Sheets.Item(1) $sheet.Cells.Item(1,1) = "Hola, Excel!" |
Ejemplo práctico
Recuperar datos de servidores y exportarlos a Excel:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Obtener información de procesos y exportar a Excel $processes = Get-Process | Select-Object Name, CPU, Id $excel = New-Object -ComObject Excel.Application $excel.Visible = $true $workbook = $excel.Workbooks.Add() $sheet = $workbook.Sheets.Item(1) $row = 1 foreach ($process in $processes) { $sheet.Cells.Item($row, 1) = $process.Name $sheet.Cells.Item($row, 2) = $process.CPU $sheet.Cells.Item($row, 3) = $process.Id $row++ } |
9. Algunas cosas más de PowerShell
Cmdlets Útiles
PowerShell tiene varios cmdlets menos conocidos pero muy útiles:
1 2 3 4 5 6 7 8 |
# Generar un número aleatorio Get-Random -Minimum 1 -Maximum 100 # Calcular el hash de un archivo Get-FileHash -Path "C:\example.txt" # Crear un enlace simbólico New-Item -ItemType SymbolicLink -Path "C:\Link" -Target "C:\TargetFolder" |
Ejemplo práctico
Crear un generador de contraseñas:
1 2 3 4 |
# Generador de contraseñas aleatorias $length = 12 $password = -join ((48..57) + (65..90) + (97..122) | Get-Random -Count $length | ForEach-Object {[char]$_}) $password |