O pipeline: introdução
Esta aula introduz o pipeline do PowerShell, mostrando como ele difere de shells tradicionais ao passar objetos inteiros em vez de texto. Você aprenderá a usar o operador | para encadear comandos e verá exemplos práticos de filtragem, seleção e processamento de dados.
O pipeline é um dos conceitos mais poderosos e distintivos do PowerShell. Diferente de shells como Bash ou cmd, o PowerShell não passa texto entre comandos, mas sim objetos .NET completos. Isso permite manipular dados de forma estruturada, sem precisar fazer parsing de texto. Nesta aula, vamos explorar como o pipeline funciona, por que ele é tão útil, e como usá-lo no seu dia a dia.
Entender o pipeline é essencial para dominar o PowerShell. Com ele, você pode encadear comandos de forma elegante, filtrar, selecionar, ordenar e transformar dados com facilidade. Vamos começar!
Passando objetos (não texto)
No PowerShell, cada comando produz um ou mais objetos .NET. Quando você conecta dois comandos com o operador pipe (|), o PowerShell passa o objeto de saída do primeiro comando diretamente para o segundo comando como entrada. Isso significa que o segundo comando recebe objetos completos, com suas propriedades e métodos, e não apenas uma representação textual.
Por exemplo, o comando Get-Process retorna objetos do tipo System.Diagnostics.Process. Se você passar isso para Get-Member, pode ver todas as propriedades e métodos disponíveis. Em shells Unix, você teria que usar ferramentas como grep e awk para extrair informações de texto, o que é frágil e propenso a erros.
Get-Process | Get-MemberO comando acima lista todos os membros (propriedades, métodos, eventos) do objeto Process. Isso é muito mais poderoso do que simplesmente ver texto formatado.
O operador |
O operador pipe (|) é usado para conectar dois cmdlets ou expressões. A sintaxe é simples: Comando1 | Comando2. O PowerShell executa Comando1 e, à medida que os objetos são produzidos, eles são enviados um a um para Comando2. Isso é chamado de processamento de streaming, que é eficiente para grandes conjuntos de dados.
Você pode encadear vários pipes: Comando1 | Comando2 | Comando3. Cada comando recebe objetos do anterior, processa e envia para o próximo. Muitos cmdlets foram projetados para funcionar no pipeline, como Where-Object, Select-Object, Sort-Object e ForEach-Object.
Get-Service | Where-Object {$_.Status -eq 'Running'} | Select-Object Name, DisplayNameEste exemplo obtém todos os serviços, filtra apenas os que estão em execução e seleciona as propriedades Name e DisplayName. O pipeline torna isso conciso e legível.
Diferença para shells Unix
Em shells Unix (Bash, Zsh), o pipe também existe, mas ele passa texto bruto (stdout) entre comandos. Por exemplo, ls -l | grep "txt" pega a saída textual de ls e filtra linhas que contêm "txt". Isso funciona, mas tem limitações: a formatação pode mudar, e você precisa de ferramentas externas para manipular texto.
No PowerShell, como os objetos são passados, você pode acessar propriedades diretamente. Por exemplo, para listar processos com mais de 100 MB de memória, em PowerShell: Get-Process | Where-Object {$_.WorkingSet -gt 100MB}. Em Bash, você teria que usar ps aux | awk '$6 > 102400', que depende da ordem das colunas e da unidade de medida.
Além disso, no PowerShell, muitos comandos aceitam entrada por pipeline e podem processar objetos de forma nativa, enquanto no Unix você frequentemente precisa de comandos como xargs para converter texto em argumentos. A abordagem orientada a objetos do PowerShell reduz a necessidade de parsing e torna os scripts mais robustos.
Exemplos
Vamos ver alguns exemplos práticos do pipeline em ação.
Exemplo 1: Filtrar eventos do log
Get-EventLog -LogName System -Newest 100 | Where-Object {$_.EntryType -eq 'Error'}Obtém os 100 eventos mais recentes do log System e filtra apenas os do tipo Error.
Exemplo 2: Ordenar e selecionar
Get-ChildItem C:\Windows\System32 -File | Sort-Object Length -Descending | Select-Object -First 10Lista os 10 maiores arquivos no diretório System32, ordenados por tamanho decrescente.
Exemplo 3: Converter objetos para CSV
Get-Process | Select-Object Name, CPU, WorkingSet | Export-Csv processos.csv -NoTypeInformationExporta uma lista de processos com nome, CPU e memória para um arquivo CSV.
Exemplo 4: Usar ForEach-Object para processar cada item
1..10 | ForEach-Object { $_ * $_ }Gera os quadrados dos números de 1 a 10.
Boas práticas
Ao usar o pipeline, lembre-se de que cada cmdlet deve ser projetado para aceitar entrada por pipeline. Nem todos os comandos aceitam; verifique a documentação. Use Get-Member para explorar os objetos que estão sendo passados. Evite usar Format-* cmdlets no meio do pipeline, pois eles quebram a estrutura de objetos; use-os apenas no final para exibição.
Referências
- Sobre pipelines (Microsoft Learn)
- Sobre objetos (Microsoft Learn)
- Where-Object (Microsoft Learn)
- Select-Object (Microsoft Learn)
- ForEach-Object (Microsoft Learn)
- Export-Csv (Microsoft Learn)
Exercícios
Escreva um comando que liste todos os serviços do Windows e filtre apenas aqueles que estão parados (Status 'Stopped').
✓ Resposta:Get-Service | Where-Object {$_.Status -eq 'Stopped'}Use o pipeline para obter os 5 processos com maior consumo de memória (WorkingSet).
✓ Resposta:Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5Crie um comando que exporte a lista de processos (apenas nome e ID) para um arquivo CSV chamado 'processos.csv'.
✓ Resposta:Get-Process | Select-Object Name, Id | Export-Csv -Path processos.csv -NoTypeInformationEscreva um comando que calcule o quadrado de cada número em uma lista de 1 a 20 e exiba o resultado.
✓ Resposta:1..20 | ForEach-Object { $_ * $_ }Use o pipeline para exibir apenas as propriedades Name, StartType e Status de todos os serviços.
✓ Resposta:Get-Service | Select-Object Name, StartType, Status