Manipular arquivos e pastas é uma das tarefas mais comuns na administração de sistemas e automação de rotinas. O PowerShell oferece um conjunto de cmdlets poderosos e consistentes que permitem listar, criar, copiar, mover e remover itens do sistema de arquivos de forma eficiente. Nesta aula, vamos explorar os principais cmdlets para essa finalidade, com foco em Get-ChildItem, Copy-Item, Move-Item, Remove-Item, Test-Path e New-Item.

Antes de mergulharmos nos detalhes, é importante entender que o PowerShell trata arquivos e pastas como itens (items) e que muitos cmdlets seguem o padrão verbo-substantivo, onde o verbo indica a ação (Get, Copy, Move, Remove, Test, New) e o substantivo indica o tipo de objeto (Item, ChildItem, Path). Essa consistência facilita a aprendizagem e o uso diário.

Get-ChildItem

O cmdlet Get-ChildItem é utilizado para listar os itens (arquivos e pastas) de um determinado diretório. É o equivalente ao comando ls no Linux ou dir no prompt do Windows, porém com muito mais flexibilidade e poder. Ele retorna objetos que podem ser filtrados, formatados e encadeados com outros cmdlets.

A sintaxe básica é Get-ChildItem -Path <caminho>. Se você omitir o parâmetro -Path, ele lista o diretório atual. Você pode usar curingas (wildcards) como * e ? para filtrar nomes, e parâmetros como -Recurse para listar subdiretórios recursivamente, -Filter para filtrar por um padrão simples e -Name para retornar apenas os nomes como strings.

Exemplo básico:

# Lista todos os itens do diretório atual
Get-ChildItem

# Lista itens de um caminho específico
Get-ChildItem -Path C:\Temp

# Lista apenas arquivos .txt
Get-ChildItem -Path C:\Temp -Filter *.txt

# Lista recursivamente todas as pastas e arquivos, incluindo subpastas
Get-ChildItem -Path C:\Temp -Recurse

# Lista apenas os nomes (sem detalhes)
Get-ChildItem -Path C:\Temp -Name

Um recurso poderoso é a capacidade de filtrar por propriedades dos objetos retornados. Por exemplo, para listar apenas arquivos maiores que 1 MB:

Get-ChildItem -Path C:\Temp -File | Where-Object { $_.Length -gt 1MB }

Note que usamos o parâmetro -File para retornar apenas arquivos (não pastas) e o Where-Object para filtrar por tamanho. O $_ representa cada objeto no pipeline.

Copy/Move/Remove-Item

Esses três cmdlets são fundamentais para gerenciar arquivos e pastas. Eles compartilham uma sintaxe semelhante, com parâmetros comuns como -Path (ou -LiteralPath), -Destination, -Force (para sobrescrever ou forçar a operação) e -Recurse (para agir em subpastas).

Copy-Item

Copia um item de um local para outro. Exemplos:

# Copia um arquivo
Copy-Item -Path C:\Temp\arquivo.txt -Destination C:\Backup\arquivo.txt

# Copia uma pasta inteira recursivamente
Copy-Item -Path C:\Temp\MinhaPasta -Destination C:\Backup\MinhaPasta -Recurse

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

Move-Item

Move um item para outro local, removendo-o do local original. Exemplos:

# Move um arquivo
Move-Item -Path C:\Temp\arquivo.txt -Destination C:\Backup\arquivo.txt

# Move uma pasta (e seu conteúdo)
Move-Item -Path C:\Temp\MinhaPasta -Destination C:\Backup\MinhaPasta

Remove-Item

Remove (exclui) um item. Cuidado: essa ação é permanente, a menos que você use o parâmetro -WhatIf para simular. Exemplos:

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

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

# Simula a remoção sem executar
Remove-Item -Path C:\Temp\arquivo.txt -WhatIf

É boa prática usar -WhatIf antes de executar remoções em lote para evitar exclusões acidentais.

Test-Path

O cmdlet Test-Path verifica se um caminho existe (seja arquivo, pasta, drive ou outro item). Ele retorna $true ou $false, sendo muito útil em scripts para validação antes de executar operações. Exemplos:

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

# Verifica se uma pasta existe
Test-Path -Path C:\Temp\MinhaPasta

# Verifica se um caminho é um contêiner (pasta)
Test-Path -Path C:\Temp\MinhaPasta -PathType Container

# Verifica se um caminho é um arquivo
Test-Path -Path C:\Temp\arquivo.txt -PathType Leaf

Você pode usar Test-Path em estruturas condicionais:

if (Test-Path -Path C:\Temp\arquivo.txt) {
    Write-Host "O arquivo existe."
} else {
    Write-Host "O arquivo não existe."
}

New-Item

O cmdlet New-Item cria novos itens, como arquivos vazios, pastas, atalhos e até chaves de registro. Para criar pastas, usamos -ItemType Directory; para arquivos, -ItemType File. Exemplos:

# Cria uma nova pasta
New-Item -Path C:\Temp\NovaPasta -ItemType Directory

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

# Cria uma pasta e um arquivo dentro dela em uma única linha
New-Item -Path C:\Temp\NovaPasta\arquivo.txt -ItemType File -Force

O parâmetro -Force permite criar itens que já existem (não gera erro) e também cria diretórios intermediários se necessário. Por exemplo, se a pasta NovaPasta não existir, o comando acima a criará automaticamente.

Para criar um arquivo com conteúdo, você pode combinar com Set-Content:

New-Item -Path C:\Temp\meu.txt -ItemType File -Force | Set-Content -Value "Olá, mundo!"

Boas práticas e observações finais

Ao trabalhar com manipulação de arquivos no PowerShell, lembre-se de:

  • Sempre verificar a existência de caminhos com Test-Path antes de operações críticas.
  • Usar -WhatIf em comandos de remoção ou movimentação em massa para prever o resultado.
  • Utilizar o pipeline para encadear cmdlets e criar soluções mais elegantes.
  • Preferir caminhos relativos ou variáveis para tornar os scripts mais portáveis.
  • Ter atenção às permissões: algumas operações podem exigir privilégios de administrador.

Exercícios

  1. Crie uma pasta chamada Teste no diretório atual e, dentro dela, crie um arquivo vazio chamado dados.txt. Em seguida, liste o conteúdo da pasta para confirmar.
  2. ✓ Resposta:
    New-Item -Path .\Teste -ItemType Directory -Force
    New-Item -Path .\Teste\dados.txt -ItemType File -Force
    Get-ChildItem -Path .\Teste
  3. Copie o arquivo dados.txt para um novo arquivo chamado copia.txt dentro da mesma pasta Teste. Depois, verifique se ambos existem usando Test-Path.
  4. ✓ Resposta:
    Copy-Item -Path .\Teste\dados.txt -Destination .\Teste\copia.txt
    Test-Path .\Teste\dados.txt
    Test-Path .\Teste\copia.txt
  5. Mova o arquivo copia.txt para o diretório pai (um nível acima). Verifique se ele não está mais na pasta original.
  6. ✓ Resposta:
    Move-Item -Path .\Teste\copia.txt -Destination .\copia.txt
    Test-Path .\Teste\copia.txt
    Test-Path .\copia.txt
  7. Remova o arquivo dados.txt da pasta Teste usando Remove-Item e depois confirme que ele não existe mais.
  8. ✓ Resposta:
    Remove-Item -Path .\Teste\dados.txt
    Test-Path .\Teste\dados.txt
  9. Liste todos os arquivos (somente arquivos, não pastas) no diretório atual e subpastas que tenham extensão .txt e que sejam maiores que 1 KB. Use Get-ChildItem com -Recurse e -Filter.
  10. ✓ Resposta:
    Get-ChildItem -Recurse -Filter *.txt | Where-Object { $_.Length -gt 1KB }

Referências