Chuleta de PowerShell
Cmdlets, pipeline de objetos y one-liners
Navegación
Lista ficheros y directorios. Alias ls, gci, dir. -Recurse recorre todo, -Force incluye ocultos.
Get-ChildItem Get-ChildItem -Recurse -Filter *.ts Get-ChildItem -Force gci -Directory
Cambia el directorio actual. Alias cd. Soporta - para el anterior y ~ para home.
Set-Location s:\MaisTools cd ~ cd ..
Muestra la ruta actual. Alias pwd.
Get-Location pwd
Comprueba si existe una ruta. Devuelve $true o $false.
Test-Path .\file.txt
Test-Path .\src -PathType Container
if (Test-Path .\dir) { 'existe' }Guarda el directorio actual en una pila (Push) y vuelve después (Pop). Útil en scripts.
Push-Location C:\Temp # ...trabalho aqui... Pop-Location
Resuelve una ruta relativa a absoluta, o el inverso con -Relative.
Resolve-Path .\src Resolve-Path -Relative C:\Temp\file.txt
Ficheros
Crea ficheros, directorios o symlinks. -ItemType define el tipo. -Force sobre fichero existente lo trunca.
New-Item -ItemType File novo.txt New-Item -ItemType Directory -Force pasta\sub New-Item -ItemType SymbolicLink -Path link -Target target
Copia ficheros o directorios. -Recurse para árboles, -Force sobrescribe el destino.
Copy-Item a.txt b.txt Copy-Item -Recurse src\ dest\ Copy-Item *.log -Destination archive\
Mueve o renombra ficheros y directorios.
Move-Item old.txt new.txt Move-Item *.log archive\
Borra ficheros o directorios. -Recurse -Force borra sin confirmar (peligroso).
Remove-Item file.txt Remove-Item -Recurse -Force node_modules Remove-Item *.tmp
Renombra ficheros. Acepta ScriptBlock en -NewName para renombrar en masa.
Rename-Item old.txt new.txt
Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace '\.txt$','.md' }Obtiene información de un item (Length, LastWriteTime, etc). No lee contenido, solo metadatos.
Get-Item .\file.txt (Get-Item file.txt).Length Get-Item file.txt | Select-Object Name, Length, LastWriteTime
Contenido
Lee el contenido de un fichero. -TotalCount como head, -Tail como tail, -Wait sigue como tail -f.
Get-Content file.txt Get-Content file.txt -TotalCount 10 Get-Content file.txt -Tail 20 Get-Content app.log -Wait -Tail 100
Escribe contenido en un fichero, sobrescribiendo. -Encoding utf8 evita el default UTF-16 con BOM en PS 5.1.
Set-Content out.txt 'linha' 'a','b','c' | Set-Content lista.txt -Encoding utf8
Añade contenido a un fichero existente. Equivalente a >> en bash.
Add-Content log.txt 'nova entrada' Get-Date | Add-Content log.txt
Redirige salida a un fichero. -Append añade, -Encoding controla la codificación.
Get-Process | Out-File processes.txt Get-Service | Out-File -Append -Encoding utf8 services.log
Vacía el contenido de un fichero sin borrarlo.
Clear-Content log.txt Clear-Content *.tmp
Pipeline
Filtra objetos del pipeline por una condición. Alias ? y where. Soporta sintaxis corta Propiedad -op Valor.
Get-Process | Where-Object { $_.CPU -gt 10 }
Get-Service | Where-Object Status -eq Running
gci | ? { $_.Length -gt 1MB }Ordena objetos por propiedad. -Descending invierte, -Unique elimina duplicados.
Get-Process | Sort-Object CPU -Descending Get-ChildItem | Sort-Object Length -Descending 'b','a','c' | Sort-Object
Selecciona N objetos del pipeline o propiedades de cada objeto. -ExpandProperty extrae el valor.
Get-Process | Select-Object -First 5 Get-Process | Select-Object Name, CPU, WS Get-Service | Select-Object -ExpandProperty Name
Itera el pipeline aplicando un bloque a cada objeto. Alias % y foreach. -Parallel corre en paralelo (PS 7+).
Get-ChildItem | ForEach-Object { $_.Name.ToUpper() }
1..5 | %{ $_ * 2 }
$urls | ForEach-Object -Parallel { Invoke-WebRequest $_ }Cuenta, suma, calcula media, máximo o mínimo de una colección. -Line, -Word, -Character para texto.
Get-Process | Measure-Object -Property WS -Sum -Average Get-Content file.txt | Measure-Object -Line Get-ChildItem | Measure-Object
Agrupa objetos por propiedad. Útil para contar ocurrencias o construir diccionarios con -AsHashTable.
Get-Process | Group-Object ProcessName Get-ChildItem | Group-Object Extension -NoElement
Búsqueda
Busca patrones en strings o ficheros. Equivalente a grep. -Pattern acepta regex, -SimpleMatch lo desactiva.
Select-String 'TODO' *.ts Select-String -Path src\*.ts -Pattern 'error' -CaseSensitive Get-ChildItem -Recurse | Select-String 'API_KEY'
Muestra cmdlets disponibles con filtros por nombre, módulo o tipo. (Get-Command npm).Source da la ruta.
Get-Command npm Get-Command *process* (Get-Command npm).Source Get-Command -Module Microsoft.PowerShell.Utility
Muestra propiedades y métodos de un objeto. Indispensable para descubrir qué se puede hacer con un tipo.
Get-Process | Get-Member (Get-Date) | Get-Member -MemberType Method 'abc' | Get-Member
Muestra ayuda de cmdlets o temas about_*. -Examples muestra ejemplos, -Online abre la versión web.
Get-Help Get-ChildItem Get-Help Get-Process -Examples Get-Help about_Variables Get-Help Set-Content -Online
Variables
Las variables empiezan por $ y no requieren declaración. Soportan arrays (@()) y hashtables (@{}).
$nome = 'Bruno'
$idade = 30
$lista = @(1, 2, 3)
$hash = @{ a = 1; b = 2 }Lee y define variables de entorno. Get-ChildItem env: las lista todas. El cambio solo vale en la sesión actual.
$env:PATH $env:USERPROFILE $env:DEBUG = 'true' Get-ChildItem env:
Valor nulo. En comparaciones coloca $null a la izquierda ($null -eq $x) para evitar sorpresas con arrays.
if ($null -eq $var) { 'vazio' }
$lista = @($null, 1, 2)
[string]::IsNullOrEmpty($x)Conversión de tipos con [tipo]. Funciona para int, string, datetime, arrays tipados, regex.
[int]'42' [datetime]'2026-01-15' [int[]]$nums = 1,2,3 [regex]::Escape($pattern)
Define el ámbito de una variable: global (toda la sesión), script (este fichero) o local (esta función).
$global:config = @{}
$script:contador = 0
function f { $local:tmp = 1 }Strings
Las comillas dobles expanden $var y $(expr). Las simples son literales y no expanden nada.
$nome = "Bruno" "Olá $nome" "Caminho: $($obj.Property)" 'literal $nome' # sem expansão
Strings multilínea (here-strings). @"..."@ expande variables, @'...'@ es literal. El cierre debe estar en la columna 0.
@" linha 1 com $nome linha 2 "@ @' literal $nome '@
Operador de formato estilo printf. Soporta números, fechas y alineación ({0,5:N2}).
'{0} tem {1} anos' -f $nome, $idade
'{0:N2}' -f 1234.5678 # 1,234.57
'{0:yyyy-MM-dd}' -f (Get-Date)Operaciones sobre strings: -replace usa regex, -split separa en array, -join junta un array en string.
'abc123' -replace '\d', 'X'
'a,b,c' -split ','
@('a','b','c') -join ', 'Control
Estructura condicional. Usa operadores PowerShell (-eq, -lt) en vez de == o <.
if (Test-Path .\file) {
'existe'
} elseif ($x -gt 0) {
'positivo'
} else {
'outro'
}Alternativa al if encadenado. -Regex y -Wildcard activan patrones, -File lee líneas de un fichero.
switch ($x) {
1 { 'um' }
2 { 'dois' }
default { 'outro' }
}
switch -Regex ($texto) {
'^\d+$' { 'número' }
}Bucles sobre colecciones (foreach), con contador (for), mientras condición (while), o al menos una vez (do/while).
foreach ($f in Get-ChildItem) { $f.Name }
for ($i = 0; $i -lt 5; $i++) { $i }
while ($cond) { ... }
do { ... } while ($cond)Captura de errores. Para atrapar errores no terminantes usa -ErrorAction Stop en el cmdlet.
try {
Cmdlet -ErrorAction Stop
} catch [System.IO.IOException] {
Write-Error "IO: $_"
} catch {
Write-Error $_
} finally {
Cleanup
}break sale del bucle, continue salta a la siguiente iteración, return sale de la función.
foreach ($x in 1..10) {
if ($x -eq 5) { break }
if ($x % 2 -eq 0) { continue }
$x
}Operadores
Operadores de comparación. No existe == en PowerShell, usa siempre -eq, -ne, -lt, -gt, -le, -ge.
$x -eq 5 # igual $x -ne 5 # diferente $x -lt 10 # menor $x -gt 0 # maior $x -le 10 # menor ou igual $x -ge 0 # maior ou igual
Otros operadores: -like usa wildcards, -match usa regex, -contains comprueba pertenencia en array, -in es el inverso.
'file.txt' -like '*.txt' # wildcards 'abc123' -match '\d+' # regex @(1,2,3) -contains 2 # pertença 2 -in @(1,2,3) # pertença (invertido)
Operadores lógicos. -and, -or, -not, -xor. ! es alias de -not.
($x -gt 0) -and ($x -lt 10) ($a -eq 1) -or ($b -eq 2) -not (Test-Path .\file) !$cond
Procesos
Lista procesos con propiedades (CPU, WS, Id, ProcessName). Sin argumentos los lista todos.
Get-Process Get-Process node, chrome Get-Process -Id 1234
Termina procesos por nombre o Id. -Force evita confirmación. Puede recibir objetos del pipeline.
Stop-Process -Name node Stop-Process -Id 1234 -Force Get-Process node | Stop-Process
Inicia un programa. -Wait bloquea hasta terminar, -NoNewWindow corre en la consola actual, -Verb RunAs eleva.
Start-Process notepad Start-Process npm -ArgumentList 'run','dev' Start-Process pwsh -Verb RunAs
Espera a que un proceso termine. -Timeout aborta tras N segundos.
Wait-Process -Name node Wait-Process -Id 1234 -Timeout 30
Ejecuta un comando o script. Necesario cuando la ruta tiene espacios o para llamar ejecutables dinámicamente.
& 'C:\Program Files\App\app.exe' arg1 arg2
& $cmd
& { Get-Process; Get-Service }Datos
Convierte JSON en objetos PowerShell. -AsHashtable devuelve hashtable (PS 6+) en vez de PSCustomObject.
Get-Content pkg.json | ConvertFrom-Json
'{"a":1}' | ConvertFrom-Json
$obj.dependenciesConvierte objetos PowerShell en JSON. -Depth controla la profundidad (default 2, suele ser demasiado bajo).
$obj | ConvertTo-Json -Depth 10
@{a=1; b=2} | ConvertTo-Json -Compress
Get-Process | Select-Object Name,Id | ConvertTo-JsonLee un CSV a objetos con propiedades. -Delimiter para ; u otros, -Header si el fichero no tiene cabecera.
Import-Csv users.csv Import-Csv data.csv -Delimiter ';' -Encoding utf8
Exporta objetos a CSV. -NoTypeInformation elimina la línea de tipo arriba (default en PS 6+).
Get-Process | Export-Csv processes.csv -NoTypeInformation $data | Export-Csv out.csv -Encoding utf8 -Delimiter ';'
Red
Cliente HTTP completo. Devuelve la respuesta como objeto con .Content, .StatusCode, .Headers. Alias iwr.
Invoke-WebRequest https://example.com iwr https://api.example.com -OutFile data.json iwr -Uri $url -Method POST -Body $body
Cliente HTTP que parsea automáticamente JSON o XML a objetos. Más usado para APIs REST. Alias irm.
Invoke-RestMethod https://api.github.com/users/octocat irm $url -Method POST -Body ($obj | ConvertTo-Json) -ContentType 'application/json'
Prueba conectividad TCP a un host y puerto. Solo en Windows. En Linux/macOS usa Test-Connection -TcpPort (PS 7+).
Test-NetConnection google.com -Port 443 Test-NetConnection -ComputerName 8.8.8.8 -TraceRoute
Equivalente a ping. -Count limita paquetes, -Quiet devuelve solo $true o $false.
Test-Connection google.com -Count 4 Test-Connection 8.8.8.8 -Quiet # bool
Módulos
Lista módulos. -ListAvailable muestra todos los instalados, no solo los cargados.
Get-Module Get-Module -ListAvailable Get-Module -Name Pester
Carga un módulo en la sesión actual. -Force recarga si ya está importado.
Import-Module Pester Import-Module .\MeuModulo.psm1 -Force
Instala módulos de PowerShell Gallery. -Scope CurrentUser evita pedir permisos de admin.
Install-Module Pester -Scope CurrentUser Install-Module Az -Force -AllowClobber
Busca módulos disponibles en PowerShell Gallery.
Find-Module Az* Find-Module -Tag azure
Avanzado
Ejecuta código en background. Receive-Job recoge los resultados, -Wait bloquea hasta estar listo.
$j = Start-Job { Get-Process }
Receive-Job $j -Wait -AutoRemoveJob
Get-Job | Remove-JobJobs en background ligeros basados en hilos (más rápidos que Start-Job). Incluido en PS 7+, en 5.1 instala con Install-Module ThreadJob.
$j = Start-ThreadJob { 1..10 | %{ $_ * 2 } }
$urls | ForEach-Object -Parallel { iwr $_ } -ThrottleLimit 5Mide el tiempo de ejecución de un bloque. Devuelve TimeSpan con TotalSeconds, TotalMilliseconds, etc.
Measure-Command { Get-ChildItem -Recurse }
(Measure-Command { ./script.ps1 }).TotalSecondsEjecuta comandos en una máquina remota vía WinRM. Soporta sesiones persistentes con -Session.
Invoke-Command -ComputerName server01 -ScriptBlock { Get-Service }
Invoke-Command -Session $s -ScriptBlock { hostname }Pausa la ejecución durante N segundos o milisegundos.
Start-Sleep -Seconds 5 Start-Sleep -Milliseconds 250
Referencia
A diferencia de bash, el pipeline de PowerShell transporta objetos con propiedades y métodos. Cada cmdlet puede acceder directamente a .Length, .Name, .CPU sin parsear texto.
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 # objectos fluem entre comandos com propriedades preservadas Get-ChildItem | Where-Object Length -gt 1MB # Each item retains its full type — pode aceder a .Length, .Name, etc. Get-Service | Group-Object Status | Format-Table Name, Count
La codificación por defecto cambió entre versiones. Saber cuál está activa evita BOMs y caracteres rotos en scripts y logs compartidos con otras herramientas.
- El default varía según el cmdlet: Out-File usa UTF-16 LE con BOM, Set-Content usa Default (ANSI/Windows-1252).
- Ninguno produce UTF-8 sin -Encoding. Pasa siempre -Encoding utf8 para ficheros compartidos con herramientas Unix.
- Default: UTF-8 sin BOM.
- Comportamiento alineado con el ecosistema. En ambos, -Encoding utf8 garantiza UTF-8.
Set-Content file.txt 'texto' -Encoding utf8
Out-File log.txt -Encoding utf8 -InputObject $data
[System.IO.File]::WriteAllText('file.txt', 'texto', [System.Text.UTF8Encoding]::new($false))PowerShell distingue errores terminantes de no terminantes. Los cmdlets fallan en silencio por defecto, usa -ErrorAction Stop para forzar try/catch a atraparlos.
Continue— comportamiento estándar, muestra el error y continúa.Stop— lo convierte en error terminante (atrapable).SilentlyContinue— oculta el error pero $? queda en $false.Ignore— oculta y no lo registra en $Error.
$?— $true si el último comando tuvo éxito.$LASTEXITCODE— exit code del último ejecutable nativo.$Error[0]— objeto del último error registrado.
try {
Get-Item .\file -ErrorAction Stop
} catch [System.IO.FileNotFoundException] {
Write-Warning "ficheiro não encontrado"
} catch {
Write-Error $_.Exception.Message
}
# verificar saída de processo nativo
git status
if ($LASTEXITCODE -ne 0) { throw "git falhou" }Windows PowerShell 5.1 (powershell.exe) y PowerShell 7+ (pwsh.exe) tienen sintaxis y features distintas. Estos detalles rompen scripts al pasar de una versión a otra.
A && B / A || B— Los operadores && y || solo existen en PS 7+. En 5.1 usa: A; if ($?) { B }$x ? a : b— El operador ternario ?: solo existe en PS 7+. En 5.1 usa if/else.$x ?? y— El operador null-coalescing ?? solo existe en PS 7+.ConvertFrom-Json -AsHashtable— ConvertFrom-Json -AsHashtable solo existe en PS 6+.ForEach-Object -Parallel— ForEach-Object -Parallel solo existe en PS 7+.
Combinaciones frecuentes para automatización y administración. Cada una resuelve una tarea específica en un único pipeline.
- 01.Encuentra ficheros mayores de 100MB recursivamente.
Get-ChildItem -Recurse -File | Where-Object Length -gt 100MB - 02.Lista los 10 ficheros más grandes del directorio actual.
Get-ChildItem | Sort-Object Length -Descending | Select-Object -First 10 - 03.Muestra los 10 procesos que más memoria consumen.
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 - 04.Muestra los 10 procesos que más CPU consumen.
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 - 05.Cuenta el número total de ficheros recursivamente.
Get-ChildItem -Recurse -File | Measure-Object | Select-Object -ExpandProperty Count - 06.Borra todos los ficheros .tmp recursivamente.
Get-ChildItem -Recurse -Filter *.tmp | Remove-Item - 07.Busca TODO en todos los ficheros TypeScript.
Get-ChildItem -Recurse -File | Where-Object Extension -in '.ts','.tsx' | Select-String 'TODO' - 08.Obtiene la IP pública externa de la máquina actual.
(Invoke-WebRequest ifconfig.me -UseBasicParsing).Content.Trim() - 09.Lista puertos TCP en escucha con el proceso asociado.
Get-NetTCPConnection -State Listen | Select-Object LocalAddress,LocalPort,OwningProcess - 10.Sigue un log en vivo comenzando por las últimas 100 líneas.
Get-Content app.log -Wait -Tail 100 - 11.Obtiene fecha y hora actuales en formato listo para nombres de fichero.
Get-Date -Format 'yyyy-MM-dd_HH-mm-ss' - 12.Crea un backup zip con la fecha en el nombre del fichero.
Compress-Archive -Path .\src -DestinationPath "backup-$(Get-Date -Format yyyy-MM-dd).zip" - 13.Formatea e imprime JSON expandido para máxima legibilidad.
Get-Content data.json | ConvertFrom-Json | ConvertTo-Json -Depth 10 - 14.Lista todas las variables de entorno ordenadas por nombre.
Get-ChildItem env: | Sort-Object Name - 15.Lista todos los servicios actualmente en ejecución.
Get-Service | Where-Object Status -eq 'Running' - 16.Prueba si un puerto TCP está abierto en un host remoto.
Test-NetConnection google.com -Port 443 - 17.Muestra el espacio libre en cada disco del sistema.
Get-Volume | Select-Object DriveLetter, SizeRemaining, Size - 18.Muestra los últimos 20 comandos del historial de la sesión.
Get-History | Select-Object -Last 20 - 19.Muestra la ruta completa de un comando (equivalente a which).
(Get-Command npm).Source - 20.Lista ficheros modificados en los últimos 7 días.
Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) }