Pular para conteúdo

PowerShell: referência

Referência completa de PowerShell para uso no dia-a-dia. Cobre desde conceitos básicos até funções avançadas.

Conceitos básicos

Variáveis

# Variáveis começam com $
$nome = "João"
$idade = 30
$ativo = $true

# Tipos explícitos
[string]$texto = "Hello"
[int]$numero = 42
[bool]$flag = $false
[datetime]$data = Get-Date

# Constantes (não podem ser alteradas)
Set-Variable -Name PI -Value 3.14159 -Option Constant

# Variáveis de ambiente
$env:PATH
$env:HOME
$env:USERNAME

Tipos de dados

# Strings
$str = "texto"
$str = 'texto literal (sem interpolação)'

# Números
$int = 42
$float = 3.14
$decimal = 19.99d

# Boolean
$verdadeiro = $true
$falso = $false

# Array
$arr = @(1, 2, 3)
$arr = 1, 2, 3  # sintaxe alternativa

# Hashtable
$hash = @{
    Nome = "João"
    Idade = 30
}

# Null
$nulo = $null

Variáveis automáticas

$_              # objeto atual no pipeline
$PSVersionTable # informações da versão do PowerShell
$HOME           # diretório home do usuário
$PWD            # diretório atual
$PROFILE        # caminho do arquivo de perfil
$?              # status do último comando (True/False)
$LASTEXITCODE   # código de saída do último programa nativo
$args           # argumentos passados para script/função
$input          # entrada do pipeline em funções
$Error          # array de erros recentes
$null           # valor nulo
$true           # booleano verdadeiro
$false          # booleano falso

Verificar versão do PowerShell

Use $PSVersionTable.PSVersion para ver a versão instalada. PowerShell 7+ é cross-platform (Windows, Linux, macOS).

Comandos de descoberta

# Descobrir comandos disponíveis
Get-Command                          # todos os comandos
Get-Command -Name *process*          # comandos com "process"
Get-Command -Module Microsoft.PowerShell.Management

# Ajuda detalhada
Get-Help Get-Process                 # ajuda básica
Get-Help Get-Process -Detailed       # com exemplos
Get-Help Get-Process -Full           # completa
Get-Help Get-Process -Online         # abre no browser
Get-Help about_*                     # tópicos conceituais

# Inspecionar objetos
Get-Process | Get-Member             # propriedades e métodos
Get-Process | Get-Member -MemberType Property
Get-Process | Get-Member -MemberType Method

Aliases comuns

# Navegação
cd      # Set-Location
pwd     # Get-Location
ls      # Get-ChildItem
dir     # Get-ChildItem

# Arquivos
cp      # Copy-Item
mv      # Move-Item
rm      # Remove-Item
cat     # Get-Content
mkdir   # New-Item -ItemType Directory

# Outros
echo    # Write-Output
cls     # Clear-Host
where   # Where-Object
select  # Select-Object
foreach # ForEach-Object
%       # ForEach-Object
?       # Where-Object

Descobrir alias

Use Get-Alias -Name ls para ver o cmdlet por trás de um alias, ou Get-Alias -Definition Get-ChildItem para ver todos os aliases de um cmdlet.

Sistema de arquivos

# Localização atual
Get-Location           # pwd
Set-Location C:\Users  # cd

# Voltar ao diretório anterior
Push-Location C:\Temp  # salva atual e vai para C:\Temp
Pop-Location           # volta ao diretório salvo

# Home do usuário
Set-Location ~
Set-Location $HOME

Listar arquivos

# Listar conteúdo
Get-ChildItem                        # ls
Get-ChildItem -Force                 # incluir ocultos
Get-ChildItem -Recurse               # recursivo
Get-ChildItem -File                  # só arquivos
Get-ChildItem -Directory             # só diretórios

# Filtrar por padrão
Get-ChildItem *.txt
Get-ChildItem -Filter *.log
Get-ChildItem -Include *.txt, *.md -Recurse
Get-ChildItem -Exclude *.tmp -Recurse

Manipular arquivos

# Criar
New-Item -Path arquivo.txt -ItemType File
New-Item -Path pasta -ItemType Directory
New-Item arquivo.txt -Value "conteúdo inicial"

# Copiar
Copy-Item origem.txt destino.txt
Copy-Item pasta -Destination nova-pasta -Recurse

# Mover/Renomear
Move-Item arquivo.txt nova-pasta/
Rename-Item arquivo.txt novo-nome.txt

# Remover
Remove-Item arquivo.txt
Remove-Item pasta -Recurse              # diretório com conteúdo
Remove-Item pasta -Recurse -Force       # forçar remoção

Conteúdo de arquivos

# Ler
Get-Content arquivo.txt
Get-Content arquivo.txt -Head 10        # primeiras 10 linhas
Get-Content arquivo.txt -Tail 10        # últimas 10 linhas
Get-Content arquivo.txt -Tail 10 -Wait  # como tail -f

# Escrever (sobrescreve)
Set-Content arquivo.txt -Value "novo conteúdo"
"texto" | Set-Content arquivo.txt

# Adicionar (append)
Add-Content arquivo.txt -Value "mais uma linha"
"texto" | Add-Content arquivo.txt

# Limpar conteúdo
Clear-Content arquivo.txt

Paths

# Construir paths
Join-Path -Path "C:\Users" -ChildPath "João"
Join-Path "C:\Users" "João" "Documents"  # múltiplos segmentos

# Separar paths
Split-Path "C:\Users\João\arquivo.txt"              # C:\Users\João
Split-Path "C:\Users\João\arquivo.txt" -Leaf        # arquivo.txt
Split-Path "C:\Users\João\arquivo.txt" -Extension   # .txt (PS 6+)

# Verificar existência
Test-Path arquivo.txt
Test-Path pasta -PathType Container     # é diretório?
Test-Path arquivo.txt -PathType Leaf    # é arquivo?

# Resolver path
Resolve-Path *.txt                      # paths completos que batem
Resolve-Path ~                          # expande ~

Strings

Interpolação

$nome = "João"
$idade = 30

# Aspas duplas: interpola variáveis
"Olá, $nome!"                           # Olá, João!
"Idade: $($idade + 1)"                  # Idade: 31 (expressão)
"Home: $($env:HOME)"                    # variável de ambiente

# Aspas simples: literal
'Olá, $nome!'                           # Olá, $nome! (literal)

Here-strings

# Here-string com interpolação
$json = @"
{
    "nome": "$nome",
    "idade": $idade
}
"@

# Here-string literal
$template = @'
Texto com $variáveis que não serão interpoladas.
Útil para templates ou regex.
'@

Métodos de string

$str = "  Hello, World!  "

# Transformação
$str.ToUpper()                          # "  HELLO, WORLD!  "
$str.ToLower()                          # "  hello, world!  "
$str.Trim()                             # "Hello, World!"
$str.TrimStart()                        # "Hello, World!  "
$str.TrimEnd()                          # "  Hello, World!"

# Busca
$str.Contains("World")                  # True
$str.StartsWith("  Hello")              # True
$str.EndsWith("!  ")                    # True
$str.IndexOf("World")                   # 9

# Manipulação
$str.Replace("World", "PowerShell")     # "  Hello, PowerShell!  "
$str.Substring(2, 5)                    # "Hello"
$str.Split(",")                         # @("  Hello", " World!  ")
"a,b,c".Split(",")                      # @("a", "b", "c")

# Juntar array em string
$arr = @("a", "b", "c")
$arr -join ", "                         # "a, b, c"
[string]::Join("-", $arr)               # "a-b-c"

Operadores de string

# -like (wildcard)
"PowerShell" -like "Power*"             # True
"PowerShell" -like "*Shell"             # True
"PowerShell" -like "*wer*"              # True

# -match (regex)
"PowerShell 7.4" -match "\d+\.\d+"      # True
$Matches[0]                             # "7.4"

# -replace (regex)
"Hello World" -replace "World", "PS"    # "Hello PS"
"abc123" -replace "\d+", "XXX"          # "abcXXX"

# -split
"a,b,c" -split ","                      # @("a", "b", "c")
"a1b2c3" -split "\d"                    # @("a", "b", "c", "")

Case sensitivity

Por padrão, operadores de string são case-insensitive. Use versões com 'c' para case-sensitive: -clike, -cmatch, -creplace.

Arrays e Hashtables

Arrays

# Criar
$arr = @(1, 2, 3)
$arr = 1, 2, 3                          # sintaxe simplificada
$arr = @()                              # array vazio
$arr = 1..10                            # range: 1 a 10

# Acessar
$arr[0]                                 # primeiro elemento
$arr[-1]                                # último elemento
$arr[0..2]                              # slice: primeiros 3
$arr[-3..-1]                            # últimos 3

# Modificar
$arr += 4                               # adicionar (cria novo array!)
$arr[0] = 99                            # alterar elemento

# Propriedades
$arr.Count                              # quantidade de elementos
$arr.Length                             # mesmo que Count

# Verificar conteúdo
$arr -contains 2                        # True
2 -in $arr                              # True (PS 3+)
$arr -notcontains 99                    # True

Performance com arrays

$arr += item cria um novo array a cada adição. Para muitas inserções, use [System.Collections.ArrayList] ou [System.Collections.Generic.List[object]].

ArrayList (mutável)

$list = [System.Collections.ArrayList]@()
$list.Add("item")                       # retorna índice
[void]$list.Add("item2")                # suprime retorno
$list.Remove("item")
$list.RemoveAt(0)
$list.Clear()

Hashtables

# Criar
$hash = @{
    Nome = "João"
    Idade = 30
    Ativo = $true
}
$hash = @{}                             # hashtable vazia

# Acessar
$hash["Nome"]                           # "João"
$hash.Nome                              # "João" (sintaxe de propriedade)
$hash.Keys                              # todas as chaves
$hash.Values                            # todos os valores

# Modificar
$hash["Email"] = "[email protected]"       # adicionar/atualizar
$hash.Cidade = "São Paulo"              # sintaxe alternativa
$hash.Remove("Idade")                   # remover

# Verificar
$hash.ContainsKey("Nome")               # True
$hash.ContainsValue("João")             # True
$hash.Count                             # quantidade de pares

# Iterar
foreach ($key in $hash.Keys) {
    "$key = $($hash[$key])"
}

$hash.GetEnumerator() | ForEach-Object {
    "$($_.Key) = $($_.Value)"
}

Ordered hashtable

# Mantém ordem de inserção
$ordered = [ordered]@{
    Primeiro = 1
    Segundo = 2
    Terceiro = 3
}

Pipeline e objetos

Pipeline básico

# Passar objetos entre comandos
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5

# $_ representa o objeto atual
Get-Process | Where-Object { $_.CPU -gt 100 }

# Sintaxe simplificada (PS 3+)
Get-Process | Where-Object CPU -gt 100

Where-Object (filtrar)

# Filtrar com script block
Get-Process | Where-Object { $_.CPU -gt 100 }
Get-Process | Where-Object { $_.Name -like "*chrome*" }
Get-Process | Where-Object { $_.WorkingSet -gt 100MB }

# Sintaxe simplificada
Get-Process | Where-Object CPU -gt 100
Get-Process | Where-Object Name -like "*chrome*"

# Múltiplas condições
Get-Process | Where-Object { $_.CPU -gt 100 -and $_.Name -ne "Idle" }

Select-Object (projetar)

# Selecionar propriedades
Get-Process | Select-Object Name, CPU, WorkingSet
Get-Process | Select-Object -Property Name, CPU

# Limitar resultados
Get-Process | Select-Object -First 5
Get-Process | Select-Object -Last 3
Get-Process | Select-Object -Skip 10 -First 5

# Propriedades calculadas
Get-Process | Select-Object Name, @{
    Name = "MemoriaMB"
    Expression = { [math]::Round($_.WorkingSet / 1MB, 2) }
}

# Expandir propriedade (extrair valor)
Get-Process | Select-Object -ExpandProperty Name    # retorna strings, não objetos

# Propriedades únicas
Get-Process | Select-Object Name -Unique

ForEach-Object (transformar)

# Executar ação em cada item
Get-Process | ForEach-Object { $_.Name.ToUpper() }
1..5 | ForEach-Object { $_ * 2 }        # 2, 4, 6, 8, 10

# Sintaxe simplificada
Get-Process | ForEach-Object Name       # extrai propriedade

# Múltiplos script blocks
1..3 | ForEach-Object -Begin { "Início" } -Process { "Item: $_" } -End { "Fim" }

Sort-Object (ordenar)

Get-Process | Sort-Object CPU
Get-Process | Sort-Object CPU -Descending
Get-Process | Sort-Object CPU, Name                 # múltiplas propriedades
Get-Process | Sort-Object { $_.WorkingSet } -Descending

Group-Object (agrupar)

Get-Process | Group-Object ProcessName
Get-Service | Group-Object Status

# Acessar grupos
$grupos = Get-Process | Group-Object ProcessName
$grupos[0].Name                         # nome do grupo
$grupos[0].Count                        # quantidade no grupo
$grupos[0].Group                        # itens do grupo

Measure-Object (estatísticas)

# Contar
Get-Process | Measure-Object            # Count
Get-ChildItem | Measure-Object

# Estatísticas numéricas
Get-Process | Measure-Object CPU -Sum -Average -Maximum -Minimum
(Get-Content arquivo.txt | Measure-Object -Line -Word -Character)

Outros cmdlets úteis

# Comparar
Compare-Object $array1 $array2

# Tee (bifurcar output)
Get-Process | Tee-Object -Variable processos | Where-Object CPU -gt 100

# Out-Null (descartar output)
Remove-Item arquivo.txt | Out-Null
$null = Remove-Item arquivo.txt         # alternativa

Pipeline vs ForEach

Para operações simples, pipeline é mais idiomático. Para lógica complexa ou quando precisa de índice, use foreach statement.

Condicionais

if/elseif/else

$idade = 25

if ($idade -lt 18) {
    "Menor de idade"
}
elseif ($idade -lt 65) {
    "Adulto"
}
else {
    "Idoso"
}

# Uma linha
if ($valor) { "Verdadeiro" } else { "Falso" }

Operadores de comparação

# Igualdade
$a -eq $b                               # igual
$a -ne $b                               # diferente

# Numéricos
$a -gt $b                               # maior que
$a -ge $b                               # maior ou igual
$a -lt $b                               # menor que
$a -le $b                               # menor ou igual

# String (case-insensitive por padrão)
$str -like "padr*"                      # wildcard
$str -notlike "padr*"
$str -match "regex"                     # regex
$str -notmatch "regex"

# Versões case-sensitive
$str -ceq "Texto"                       # igual case-sensitive
$str -clike "Pad*"
$str -cmatch "Regex"

# Coleções
$arr -contains "item"                   # contém
"item" -in $arr                         # está em
$arr -notcontains "item"
"item" -notin $arr

# Tipo
$obj -is [string]                       # é do tipo
$obj -isnot [int]

Operadores lógicos

$a -and $b                              # E
$a -or $b                               # OU
-not $a                                 # NÃO
!$a                                     # NÃO (alternativa)
$a -xor $b                              # OU exclusivo

switch

$dia = "segunda"

switch ($dia) {
    "segunda" { "Início da semana" }
    "sexta" { "Quase fim de semana!" }
    "sábado" { "Fim de semana!" }
    "domingo" { "Fim de semana!" }
    default { "Dia comum" }
}

# Com wildcard
switch -Wildcard ($arquivo) {
    "*.txt" { "Arquivo de texto" }
    "*.ps1" { "Script PowerShell" }
    default { "Outro tipo" }
}

# Com regex
switch -Regex ($texto) {
    "^\d+$" { "Apenas números" }
    "^[a-z]+$" { "Apenas letras" }
    default { "Misto" }
}

# Múltiplos matches (sem break implícito)
switch ($valor) {
    { $_ -gt 0 } { "Positivo" }
    { $_ -lt 100 } { "Menor que 100" }
    10 { "É dez!" }
}

Ternário (PS 7+)

$resultado = $condicao ? "verdadeiro" : "falso"
$status = $ativo ? "Ativo" : "Inativo"

Null-coalescing (PS 7+)

$valor = $variavel ?? "padrão"          # usa "padrão" se $variavel é $null
$variavel ??= "padrão"                  # atribui se $null

PowerShell 7+

Operador ternário (?:) e null-coalescing (??, ??=) requerem PowerShell 7+.

Loops

foreach

# foreach statement (mais rápido)
foreach ($item in $colecao) {
    $item
}

# Com índice
$arr = @("a", "b", "c")
for ($i = 0; $i -lt $arr.Count; $i++) {
    "$i : $($arr[$i])"
}

# ForEach-Object cmdlet (pipeline)
$colecao | ForEach-Object { $_ }

for

for ($i = 0; $i -lt 10; $i++) {
    "Iteração $i"
}

# Decremento
for ($i = 10; $i -gt 0; $i--) {
    $i
}

while

$i = 0
while ($i -lt 5) {
    $i
    $i++
}

do-while / do-until

# do-while: executa enquanto condição é verdadeira
$i = 0
do {
    $i
    $i++
} while ($i -lt 5)

# do-until: executa até condição ser verdadeira
$i = 0
do {
    $i
    $i++
} until ($i -ge 5)

Controle de loop

# break: sai do loop
foreach ($item in $colecao) {
    if ($item -eq "parar") { break }
    $item
}

# continue: pula para próxima iteração
foreach ($item in $colecao) {
    if ($item -eq "pular") { continue }
    $item
}

# return: sai da função/script (não apenas do loop)

Ranges

# Range simples
1..10                                   # 1 a 10
10..1                                   # 10 a 1 (decrescente)

# Iterar com range
foreach ($i in 1..5) {
    "Número: $i"
}

# Letras
[char]'a'..[char]'z' | ForEach-Object { [char]$_ }

Funções

Sintaxe básica

function Get-Greeting {
    "Hello, World!"
}

# Com parâmetros
function Get-Greeting {
    param (
        [string]$Nome
    )
    "Hello, $Nome!"
}

# Sintaxe alternativa para parâmetros
function Get-Greeting($Nome) {
    "Hello, $Nome!"
}

# Chamar
Get-Greeting -Nome "João"
Get-Greeting "João"                     # posicional

Parâmetros avançados

function Get-UserInfo {
    [CmdletBinding()]
    param (
        # Obrigatório
        [Parameter(Mandatory)]
        [string]$Nome,

        # Com valor padrão
        [int]$Idade = 0,

        # Validação
        [ValidateRange(1, 150)]
        [int]$Anos,

        [ValidateSet("Ativo", "Inativo")]
        [string]$Status = "Ativo",

        [ValidateNotNullOrEmpty()]
        [string]$Email,

        [ValidateScript({ Test-Path $_ })]
        [string]$Caminho,

        # Switch (booleano)
        [switch]$Detalhado,

        # Aceita múltiplos valores
        [string[]]$Tags
    )

    # Corpo da função
    if ($Detalhado) {
        "Nome: $Nome, Idade: $Idade, Status: $Status"
    }
    else {
        $Nome
    }
}

Pipeline input

function Process-Item {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline)]
        [string]$Item
    )

    begin {
        "Iniciando processamento"
    }

    process {
        "Processando: $Item"
    }

    end {
        "Finalizado"
    }
}

# Uso
"a", "b", "c" | Process-Item

# ValueFromPipelineByPropertyName
function Get-FileName {
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [Alias("FullName")]
        [string]$Path
    )

    process {
        Split-Path $Path -Leaf
    }
}

Get-ChildItem | Get-FileName

Retorno de valores

function Get-Dobro {
    param ([int]$Numero)

    # Qualquer output vai para o retorno
    $Numero * 2
}

function Get-Info {
    param ([string]$Nome)

    # Retorno explícito
    return @{
        Nome = $Nome
        Data = Get-Date
    }
}

# Múltiplos valores
function Get-Numeros {
    1
    2
    3
    # ou: return 1, 2, 3
    # ou: 1, 2, 3
}

$resultado = Get-Numeros  # @(1, 2, 3)

Output não intencional

Qualquer expressão não atribuída a variável vai para o output. Use [void], $null = ou | Out-Null para suprimir.

Escopo

$global:var = "global"                  # acessível em todo lugar
$script:var = "script"                  # acessível no script
$local:var = "local"                    # padrão, escopo atual
$private:var = "private"                # não visível em escopos filhos

function Test-Escopo {
    $var = "local na função"
    $script:var = "alterando script"
}

Tratamento de erros

try/catch/finally

try {
    # Código que pode falhar
    $resultado = Get-Content "arquivo-inexistente.txt" -ErrorAction Stop
}
catch [System.IO.FileNotFoundException] {
    # Erro específico
    Write-Warning "Arquivo não encontrado: $_"
}
catch {
    # Qualquer outro erro
    Write-Error "Erro: $_"
    Write-Error $_.Exception.Message
}
finally {
    # Sempre executa
    "Limpeza"
}

ErrorAction

# Por comando
Get-Content arquivo.txt -ErrorAction SilentlyContinue
Get-Content arquivo.txt -ErrorAction Stop
Get-Content arquivo.txt -ErrorAction Continue  # padrão

# Valores de ErrorAction:
# - Continue: mostra erro, continua (padrão)
# - SilentlyContinue: ignora erro silenciosamente
# - Stop: converte em exceção terminadora
# - Inquire: pergunta ao usuário
# - Ignore: ignora completamente (nem vai para $Error)

# Variável de preferência (para todo o script)
$ErrorActionPreference = "Stop"

Variável $Error

$Error                                  # lista de erros recentes
$Error[0]                               # erro mais recente
$Error[0].Exception.Message
$Error.Clear()                          # limpar histórico

throw

function Test-Valor {
    param ([int]$Valor)

    if ($Valor -lt 0) {
        throw "Valor não pode ser negativo"
    }

    $Valor
}

# Com tipo de exceção
throw [System.ArgumentException]::new("Argumento inválido")

Write-Error vs throw

# Write-Error: erro não-terminador
Write-Error "Algo deu errado"
"Esta linha executa"

# throw: erro terminador
throw "Erro fatal"
"Esta linha não executa"

Quando usar cada um

Use throw para erros que devem parar a execução. Use Write-Error para reportar problemas mas continuar processando outros itens.

Módulos

Gerenciar módulos

# Listar módulos disponíveis
Get-Module -ListAvailable

# Listar módulos carregados
Get-Module

# Importar módulo
Import-Module NomeMódulo

# Remover módulo
Remove-Module NomeMódulo

# Encontrar no PSGallery
Find-Module -Name "*Azure*"

# Instalar do PSGallery
Install-Module -Name Az -Scope CurrentUser
Install-Module -Name Pester -Force

# Atualizar módulo
Update-Module -Name Az

# Desinstalar
Uninstall-Module -Name NomeMódulo

Módulos úteis

# Pester - framework de testes
Install-Module Pester -Scope CurrentUser

# PSReadLine - melhorias no console (já incluído no PS 5.1+)
# Configurações úteis:
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -EditMode Emacs

# Terminal-Icons - ícones no terminal
Install-Module Terminal-Icons -Scope CurrentUser
Import-Module Terminal-Icons

# Az - Azure PowerShell
Install-Module Az -Scope CurrentUser

Criar módulo simples

# Arquivo: MeuModulo.psm1
function Get-Saudacao {
    param ([string]$Nome)
    "Olá, $Nome!"
}

function Get-DataFormatada {
    (Get-Date).ToString("dd/MM/yyyy")
}

# Exportar funções
Export-ModuleMember -Function Get-Saudacao, Get-DataFormatada

Perfil

Caminhos do perfil

$PROFILE                                # perfil do usuário atual, host atual
$PROFILE.CurrentUserCurrentHost         # mesmo que $PROFILE
$PROFILE.CurrentUserAllHosts            # usuário atual, todos os hosts
$PROFILE.AllUsersCurrentHost            # todos os usuários, host atual
$PROFILE.AllUsersAllHosts               # todos os usuários, todos os hosts

# Verificar se existe
Test-Path $PROFILE

# Criar se não existir
if (!(Test-Path $PROFILE)) {
    New-Item $PROFILE -ItemType File -Force
}

# Editar
code $PROFILE                           # VS Code
notepad $PROFILE                        # Notepad

Exemplo de perfil

# ~/.config/powershell/Microsoft.PowerShell_profile.ps1 (PS 7+ Linux/Mac)
# ~/Documents/PowerShell/Microsoft.PowerShell_profile.ps1 (PS 7+ Windows)
# ~/Documents/WindowsPowerShell/Microsoft.PowerShell_profile.ps1 (PS 5.1)

# Módulos
Import-Module Terminal-Icons
Import-Module PSReadLine

# PSReadLine
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -PredictionViewStyle ListView
Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete

# Aliases/Funções
function ll { Get-ChildItem -Force $args }
function .. { Set-Location .. }
function ... { Set-Location ../.. }

# Alias para editor
Set-Alias -Name vim -Value nvim
Set-Alias -Name code -Value "code-insiders"

# Variáveis de ambiente
$env:EDITOR = "nvim"

Comandos úteis

Saída e formatação

# Formatar como tabela
Get-Process | Format-Table Name, CPU, WorkingSet -AutoSize

# Formatar como lista
Get-Process | Format-List *

# Saída para arquivo
Get-Process | Out-File processos.txt
Get-Process | Out-File processos.txt -Append

# Exportar CSV
Get-Process | Export-Csv processos.csv -NoTypeInformation
Import-Csv processos.csv

# JSON
Get-Process | ConvertTo-Json | Out-File processos.json
Get-Content processos.json | ConvertFrom-Json

# XML
Get-Process | Export-Clixml processos.xml
Import-Clixml processos.xml

# Clipboard
Get-Process | clip                      # Windows
Get-Process | Set-Clipboard             # PS 5.1+
Get-Clipboard

Web requests

# Download simples
Invoke-WebRequest -Uri "https://example.com" -OutFile pagina.html

# GET com headers
$response = Invoke-WebRequest -Uri "https://api.example.com/data" -Headers @{
    "Authorization" = "Bearer $token"
}
$response.Content
$response.StatusCode

# REST API (retorna objetos)
$dados = Invoke-RestMethod -Uri "https://api.example.com/users"
$dados.name

# POST JSON
$body = @{
    nome = "João"
    email = "[email protected]"
} | ConvertTo-Json

Invoke-RestMethod -Uri "https://api.example.com/users" `
    -Method Post `
    -Body $body `
    -ContentType "application/json"

Processos e serviços

# Processos
Get-Process
Get-Process -Name chrome
Get-Process | Where-Object CPU -gt 100
Stop-Process -Name notepad
Stop-Process -Id 1234
Start-Process notepad
Start-Process "https://google.com"      # abre no browser

# Serviços (requer elevação no Windows)
Get-Service
Get-Service -Name wuauserv
Start-Service -Name wuauserv
Stop-Service -Name wuauserv
Restart-Service -Name wuauserv

Jobs (background)

# Iniciar job
$job = Start-Job -ScriptBlock { Get-Process }

# Verificar status
Get-Job

# Aguardar conclusão
Wait-Job -Id $job.Id

# Obter resultado
Receive-Job -Id $job.Id

# Remover job
Remove-Job -Id $job.Id

# Job com parâmetros
Start-Job -ScriptBlock { param($nome) "Olá, $nome" } -ArgumentList "João"

Remoting (se habilitado)

# Sessão interativa
Enter-PSSession -ComputerName servidor

# Executar comando remoto
Invoke-Command -ComputerName servidor -ScriptBlock { Get-Process }

# Em múltiplas máquinas
Invoke-Command -ComputerName srv1, srv2, srv3 -ScriptBlock { hostname }

Data e hora

Get-Date
Get-Date -Format "dd/MM/yyyy HH:mm:ss"
Get-Date -Format "yyyy-MM-dd"
(Get-Date).AddDays(7)
(Get-Date).AddHours(-2)

# Diferença entre datas
$inicio = Get-Date "2024-01-01"
$fim = Get-Date
($fim - $inicio).Days

Matemática

[math]::Round(3.14159, 2)               # 3.14
[math]::Floor(3.9)                      # 3
[math]::Ceiling(3.1)                    # 4
[math]::Abs(-5)                         # 5
[math]::Max(1, 5)                       # 5
[math]::Min(1, 5)                       # 1
[math]::Pow(2, 8)                       # 256
[math]::Sqrt(16)                        # 4