Bem-vindo à aula 47 do nosso curso de PowerShell! Hoje vamos explorar um dos aspectos mais fundamentais do uso diário do PowerShell: a manipulação de arquivos e pastas. Dominar esses comandos é essencial para automatizar tarefas de administração de sistemas, organizar dados e criar scripts eficientes. Ao final desta aula, você será capaz de listar, copiar, mover, excluir e criar arquivos e diretórios com confiança.

O PowerShell oferece uma série de cmdlets (command-lets) que seguem o padrão Verbo-Substantivo, tornando a sintaxe intuitiva. Nesta aula, focaremos nos cmdlets mais utilizados: Get-ChildItem, Copy-Item, Move-Item, Remove-Item, Test-Path e New-Item. Vamos mergulhar em cada um deles, com exemplos práticos e boas práticas.

Get-ChildItem

O cmdlet Get-ChildItem é o equivalente ao comando ls no Linux ou dir no Windows. Ele lista os itens (arquivos e pastas) em um local especificado, como um diretório ou unidade. Este cmdlet é extremamente flexível, permitindo filtros por nome, extensão, atributos e até mesmo recursão em subpastas.

Vamos começar com o uso básico. Sem parâmetros, ele lista o conteúdo do diretório atual. Para listar um diretório específico, basta informar o caminho. Você também pode usar curingas (* e ?) para filtrar nomes. Por exemplo, para listar todos os arquivos .txt em um diretório, usaríamos Get-ChildItem *.txt.

# Lista o conteúdo do diretório atual
Get-ChildItem

# Lista o conteúdo de um diretório específico
Get-ChildItem -Path C:\Temp

# Lista todos os arquivos .txt no diretório atual
Get-ChildItem -Filter "*.txt"

# Lista todos os itens, incluindo subpastas, recursivamente
Get-ChildItem -Recurse

# Lista apenas diretórios
Get-ChildItem -Directory

# Lista apenas arquivos
Get-ChildItem -File

Além de listar, você pode obter informações detalhadas sobre cada item, como tamanho, data de criação e atributos. Por padrão, o Get-ChildItem retorna objetos FileInfo e DirectoryInfo, que podem ser manipulados e formatados. Por exemplo, para exibir o tamanho dos arquivos em megabytes, você pode usar Select-Object e Format-Table.

# Lista arquivos com tamanho em MB
Get-ChildItem -File | Select-Object Name, @{Name="SizeMB"; Expression={[math]::Round($_.Length / 1MB, 2)}}

# Ordena por tamanho decrescente
Get-ChildItem -File | Sort-Object Length -Descending

Uma dica importante: use o parâmetro -Recurse com cuidado, pois pode retornar uma grande quantidade de itens. Combine com filtros para otimizar a busca.

Copy/Move/Remove-Item

Esses três cmdlets são a base para gerenciar arquivos e pastas. Copy-Item copia itens de um local para outro, Move-Item move (ou renomeia) itens, e Remove-Item exclui itens. Vamos analisar cada um.

Copy-Item: Para copiar um arquivo, especifique o caminho de origem e o destino. Se o destino for um diretório, o arquivo será copiado para dentro dele mantendo o nome. Você também pode renomear o arquivo no destino. Para copiar diretórios inteiros, use o parâmetro -Recurse. O parâmetro -Force sobrescreve arquivos existentes.

# Copia um arquivo para outro diretório
Copy-Item -Path C:\Temp\arquivo.txt -Destination D:\Backup\arquivo.txt

# Copia um arquivo renomeando-o
Copy-Item C:\Temp\arquivo.txt D:\Backup\novo_nome.txt

# Copia um diretório inteiro recursivamente
Copy-Item -Path C:\Temp\Pasta -Destination D:\Backup\Pasta -Recurse

# Copia e sobrescreve se já existir
Copy-Item -Path C:\Temp\arquivo.txt -Destination D:\Backup\arquivo.txt -Force

Move-Item: Funciona de forma semelhante ao Copy-Item, mas remove o item original após a cópia. Também pode ser usado para renomear arquivos ou pastas, movendo para o mesmo diretório com um novo nome. Se o destino for um diretório, o item é movido para dentro dele.

# Move um arquivo para outro diretório
Move-Item -Path C:\Temp\arquivo.txt -Destination D:\Backup\arquivo.txt

# Renomeia um arquivo no mesmo diretório
Move-Item -Path C:\Temp\arquivo.txt -Destination C:\Temp\novo_nome.txt

# Move um diretório inteiro
Move-Item -Path C:\Temp\Pasta -Destination D:\Backup\Pasta

Remove-Item: Exclui arquivos ou pastas. Para pastas, o parâmetro -Recurse é necessário para excluir todo o conteúdo. O parâmetro -Force remove itens ocultos ou somente leitura. Cuidado: essa ação é permanente, não vai para a Lixeira.

# Remove um arquivo
Remove-Item -Path C:\Temp\arquivo.txt

# Remove uma pasta e todo o seu conteúdo
Remove-Item -Path C:\Temp\Pasta -Recurse

# Remove um arquivo somente leitura
Remove-Item -Path C:\Temp\arquivo.txt -Force

# Exclui todos os arquivos .log de uma pasta
Remove-Item -Path C:\Temp\*.log -Force

Dica de segurança: antes de usar Remove-Item em massa, é prudente verificar o que será excluído com Get-ChildItem ou usar o parâmetro -WhatIf para simular a operação sem executá-la.

# Simula a exclusão sem realmente excluir
Remove-Item -Path C:\Temp\*.log -WhatIf

Test-Path

O cmdlet Test-Path verifica se um caminho (arquivo, pasta, registro, etc.) existe. Ele retorna $true ou $false, sendo essencial para validações em scripts. Você pode testar a existência de um caminho específico ou combinar com filtros.

Exemplo prático: antes de copiar um arquivo, você pode verificar se o diretório de destino existe; se não, criá-lo. Isso evita erros no script.

# Verifica se um arquivo existe
Test-Path C:\Temp\arquivo.txt

# Verifica se um diretório existe
Test-Path C:\Temp

# Verifica se algum arquivo .txt existe em um diretório
Test-Path C:\Temp\*.txt

# Uso em um script: se o destino não existir, cria
$destino = "D:\Backup"
if (-not (Test-Path $destino)) {
    New-Item -Path $destino -ItemType Directory
}

O Test-Path também pode verificar outros tipos de itens, como chaves do registro ou variáveis de ambiente, mas aqui focamos no sistema de arquivos. É uma ferramenta simples, mas poderosa para controle de fluxo.

New-Item

O cmdlet New-Item cria novos itens, como arquivos, pastas, links simbólicos, chaves de registro, etc. O parâmetro -ItemType define o tipo: File, Directory, SymbolicLink, entre outros. Você pode criar um item em um caminho específico e, opcionalmente, definir seu conteúdo inicial.

Para criar um diretório vazio, use New-Item -ItemType Directory. Para criar um arquivo vazio, use New-Item -ItemType File. Você também pode criar arquivos com conteúdo usando Set-Content ou o parâmetro -Value.

# Cria um diretório
New-Item -Path C:\Temp\NovaPasta -ItemType Directory

# Cria um arquivo vazio
New-Item -Path C:\Temp\novo.txt -ItemType File

# Cria um arquivo com conteúdo inicial
New-Item -Path C:\Temp\config.txt -ItemType File -Value "Configuração inicial"

# Cria uma estrutura de diretórios aninhados de uma vez
New-Item -Path C:\Temp\Nivel1\Nivel2\Nivel3 -ItemType Directory -Force

O parâmetro -Force é útil para criar diretórios intermediários que ainda não existem. Repare no exemplo acima: sem -Force, o comando falharia se Nivel1 não existisse. Com ele, toda a cadeia é criada.

Além de arquivos e pastas, você pode criar atalhos (arquivos .lnk) usando New-Item -ItemType SymbolicLink, mas isso requer privilégios administrativos em muitos casos. Para a maioria das tarefas, File e Directory são suficientes.

Boas Práticas e Observações Finais

Ao trabalhar com arquivos e pastas no PowerShell, adote estas boas práticas:

  • Sempre valide caminhos com Test-Path antes de operações críticas.
  • Use -WhatIf ao testar scripts que removem ou movem muitos itens.
  • Prefira caminhos completos em scripts para evitar ambiguidade com o diretório atual.
  • Considere usar -ErrorAction Stop para interromper o script em caso de erro, facilitando o tratamento.
  • Documente seus scripts com comentários explicando o que cada parte faz.

Esses cmdlets são a base para muitas tarefas de automação. Combiná-los com estruturas de controle como foreach e if permite criar scripts poderosos. Pratique os exercícios a seguir para consolidar o conhecimento.

Exercícios

  1. Crie um diretório chamado Teste no diretório atual e, dentro dele, crie um arquivo chamado dados.txt com o conteúdo "Olá, mundo!".
  2. ✓ Resposta:
    New-Item -Path .\Teste -ItemType Directory
    New-Item -Path .\Teste\dados.txt -ItemType File -Value "Olá, mundo!"
  3. Liste todos os arquivos com extensão .txt no diretório C:\Windows e seus subdiretórios, mas apenas os que tenham tamanho maior que 1 KB. Exiba o nome e o tamanho em KB.
  4. ✓ Resposta:
    Get-ChildItem -Path C:\Windows -Filter *.txt -Recurse | Where-Object { $_.Length -gt 1KB } | Select-Object Name, @{Name="SizeKB"; Expression={[math]::Round($_.Length / 1KB, 2)}}
  5. Copie o diretório Teste (criado no exercício 1) para o diretório Backup no diretório atual. Se o diretório Backup não existir, crie-o antes.
  6. ✓ Resposta:
    if (-not (Test-Path .\Backup)) { New-Item -Path .\Backup -ItemType Directory }
    Copy-Item -Path .\Teste -Destination .\Backup\Teste -Recurse
  7. Mova o arquivo dados.txt de dentro de Teste para o diretório atual e renomeie-o para dados_movidos.txt.
  8. ✓ Resposta:
    Move-Item -Path .\Teste\dados.txt -Destination .\dados_movidos.txt
  9. Exclua o diretório Backup e todo o seu conteúdo, mas primeiro verifique se ele existe. Use -WhatIf para simular a exclusão e depois execute a exclusão real.
  10. ✓ Resposta:
    if (Test-Path .\Backup) {
        Remove-Item -Path .\Backup -Recurse -WhatIf
        Remove-Item -Path .\Backup -Recurse
    }

Referências