Para uma melhor experiência com caixas de código, experimente ver o site em um Desktop.
Por muito tempo eu relutei em usar o PowerShell por achar difícil e duvidar que resolveria meus problemas. Na época em que trabalhava no Helpdesk, eu só sabia o básico. Mas tudo mudou quando decidi usá-lo para automatizar tarefas do meu dia a dia — como configurar perfis, pastas de rede e programas nas máquinas dos usuários. Atividades que levavam horas passaram a ser feitas em minutos. Essa virada me deu um ganho enorme de tempo, acabou com os erros manuais e me fez perceber que não preciso ser um expert para extrair um valor gigantesco do PowerShell. Aprender o básico vale cada minuto do seu investimento.
O PowerShell é o shell e a linguagem de script da Microsoft para administrar o Windows. Ele substitui o antigo Prompt de Comando (cmd) com uma diferença importante: em vez de devolver texto, os comandos devolvem objetos, com propriedades que você pode filtrar, ordenar e reaproveitar.
Este é o primeiro post da nossa trilha de PowerShell. Aqui vamos ver o que você precisa para se virar no console: como os comandos são nomeados, como encontrar um comando e pedir ajuda, como guardar resultados em variáveis e como encadear comandos com o pipeline.
Os exemplos foram escritos para o Windows PowerShell 5.1, que já vem no Windows 10, no Windows 11 e no Windows Server. Abra o Windows PowerShell ou o Windows PowerShell ISE pelo menu Iniciar e digite cada exemplo. Nenhum deles altera o sistema: todos só consultam informações.
Os comandos do PowerShell se chamam cmdlets e seguem sempre o mesmo padrão: um verbo, um hífen e um substantivo no singular. O verbo diz o que fazer, e o substantivo, com o quê. Get-Service lista os serviços, Get-Process lista os processos e Stop-Service para um serviço.
# Windows PowerShell 5.1
Get-Service
Get-Process
Assim como as funções que vamos criar mais adiante na trilha, os cmdlets aceitam parâmetros, sempre começando com um hífen. Para ver só o serviço de impressão (Spooler):
# Windows PowerShell 5.1
Get-Service -Name Spooler
Você não precisa decorar os nomes. Como todos seguem o padrão, o Get-Command encontra o que você procura pelo verbo, pelo substantivo ou por parte do nome:
# Windows PowerShell 5.1
Get-Command -Noun Service # tudo o que trabalha com serviços
Get-Command -Verb Restart # tudo o que reinicia alguma coisa
Get-Command *firewall* # qualquer comando com "firewall" no nome
No console, a tecla Tab também completa nomes de comandos e de parâmetros: digite Get-Serv e pressione Tab.
O Get-Help mostra a documentação de qualquer cmdlet. O parâmetro -Examples vai direto aos exemplos de uso, que costumam ser a parte mais útil:
# Windows PowerShell 5.1
Get-Help Get-Service -Examples
Get-Help Get-Service -Online # abre a página da documentação no navegador
Na primeira vez, o PowerShell 5.1 mostra só uma ajuda resumida, porque os arquivos completos não vêm instalados. Para baixá-los, rode Update-Help uma vez em um PowerShell aberto como administrador e com acesso à internet. Sem internet, o -Online resolve a partir de outra máquina.
Variáveis guardam valores para usar depois. No PowerShell, elas começam com $. Uma variável pode guardar um texto, um número ou o resultado de um comando inteiro:
# Windows PowerShell 5.1
$site = "JBitCore"
$total = 10 + 5
$servico = Get-Service -Name Spooler
$site
$total
$servico
A variável $servico não guarda um texto: ela guarda um objeto, com propriedades como o nome e o status do serviço. Você acessa cada propriedade com um ponto, e o Get-Member lista todas as que existem:
# Windows PowerShell 5.1
$servico.Status # Running ou Stopped
$servico.DisplayName
$servico | Get-Member -MemberType Property
É isso que torna o PowerShell diferente do cmd. Em vez de recortar pedaços de texto da saída de um comando, você pede exatamente a propriedade que precisa.
O caractere | (pipe) passa o resultado de um comando para o próximo. Com ele, você monta uma sequência de etapas, e cada uma trabalha sobre os objetos que recebeu da anterior:
# Windows PowerShell 5.1
Get-Service |
Where-Object Status -eq 'Running' |
Sort-Object DisplayName |
Select-Object Name, DisplayName, Status
Lendo de cima para baixo: o Get-Service lista todos os serviços, o Where-Object deixa passar só os que estão em execução, o Sort-Object ordena pelo nome de exibição e o Select-Object mostra apenas três colunas. Quando a linha termina com um |, o PowerShell entende que o comando continua na linha de baixo.
Mais dois exemplos do dia a dia:
# Windows PowerShell 5.1
# Quantos serviços estão parados?
(Get-Service | Where-Object Status -eq 'Stopped').Count
# Os 5 processos que mais usam memória
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, Id, WorkingSet
Alguns comandos têm apelidos (aliases) para facilitar a digitação e para quem vem do cmd ou do Linux. O dir e o ls, por exemplo, são o mesmo cmdlet:
# Windows PowerShell 5.1
Get-Alias dir
Get-Alias ls
Os dois apontam para o Get-ChildItem. Aliases são ótimos no console, mas em scripts use sempre o nome completo do cmdlet: o script fica mais fácil de ler para quem não conhece os atalhos.
Com o padrão Verbo-Substantivo, o Get-Command e o Get-Help, você consegue descobrir sozinho quase qualquer comando. Com variáveis, objetos e o pipeline, você já consegue responder perguntas reais sobre o sistema em uma linha. O próximo passo da trilha é organizar esses comandos em blocos reutilizáveis, com funções e parâmetros.