Não deixe de ler os artigos anteriores da série:
- Aprenda a automatizar o Windows com o PowerShell
- Aprendendo a usar cmdlets no PowerShell
E fique ligado para o resto da série durante toda a semana.
Objetos
Você já se perguntou o que diferencia o PowerShell de um shell tradicional do Linux como o Bash, ou até mesmo o prompt de comando herdado? A resposta é muito simples: os shells tradicionais emitem texto, o que dificulta a execução de tarefas como formatação e filtragem. Claro, existem ferramentas para ajudá-lo a fazer o trabalho (sed e grep vêm à mente), mas no final do dia, se você quiser fazer qualquer tipo de análise de texto pesado, você precisa saber expressões regulares como o parte de trás da sua mão.
O PowerShell aproveita a estrutura.Net subjacente e adota uma abordagem diferente, usando objetos em vez de texto. Objetos são apenas uma representação de algo. Eles são uma coleção de partes e ações para usá-los. Vamos dar uma olhada nas partes de uma bicicleta e em como podemos usá-las.
Objetos em.Net são praticamente os mesmos, exceto por duas pequenas diferenças: as “Partes” são chamadas propriedades e as "Instruções" são chamadas métodos. Se quisermos representar um Serviço do Windows como um objeto, poderemos decidir que é apropriado descrevê-lo usando três propriedades: Nome do Serviço, Estado e Descrição. Também precisamos interagir com o serviço, portanto, podemos dar ao objeto um método Start, Stop e Pause.
O Pipeline
Há uma abundância de shells do Linux com um pipeline, permitindo que você envie o texto que um comando produz como entrada para o próximo comando no pipeline. O PowerShell leva isso para o próximo nível, permitindo que você pegue os objetos que um cmdlet gera e os transmita como entrada para o próximo cmdlet no pipeline. O truque é saber que tipo de objeto um cmdlet retorna, o que é realmente fácil ao usar o cmdlet Get-Member.
Get-Service | Get-Member
System.ServiceProcess.ServiceController
Como o PowerShell lida com objetos e não com texto, nem todos os cmdlets podem ser vinculados usando o pipeline [1]. Isso significa que precisamos encontrar um cmdlet que queira aceitar um objeto System.ServiceProcess.ServiceController do pipeline.
Get-Command -ParameterType System.ServiceProcess.ServiceController
Get-Help –Name Stop-Service
Get-Help -Name Stop-Service –Full
- Get-Service retorna objetos ServiceController
- Stop-Service tem um parâmetro chamado InputObject que aceita um ou mais ServiceControllers como entrada.
- O parâmetro InputObject aceita entrada de pipeline.
Usando essas informações, podemos fazer o seguinte:
Get-Service -Name ‘Apple Mobile Device’ | Stop-Service
Dever de casa
Leia sobre o pipeline de objetos
Se você tiver alguma dúvida, pode enviar um tweet para mim @taybgibb ou apenas deixar um comentário.