Manipulando arquivos e pastas
Nesta aula, você aprenderá a manipular arquivos e pastas no PowerShell, dominando cmdlets essenciais como Get-ChildItem para listar, Copy-Item, Move-Item e Remove-Item para copiar, mover e excluir, além de Test-Path para verificar existência e New-Item para criar novos itens. Com exemplos práticos e exercícios, você estará apto a gerenciar o sistema de arquivos de forma eficiente.
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 -FileAlé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 -DescendingUma 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 -ForceMove-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\PastaRemove-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 -ForceDica 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 -WhatIfTest-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 -ForceO 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-Pathantes de operações críticas. - Use
-WhatIfao testar scripts que removem ou movem muitos itens. - Prefira caminhos completos em scripts para evitar ambiguidade com o diretório atual.
- Considere usar
-ErrorAction Stoppara 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
- Crie um diretório chamado
Testeno diretório atual e, dentro dele, crie um arquivo chamadodados.txtcom o conteúdo "Olá, mundo!". - Liste todos os arquivos com extensão
.txtno diretórioC:\Windowse seus subdiretórios, mas apenas os que tenham tamanho maior que 1 KB. Exiba o nome e o tamanho em KB. - Copie o diretório
Teste(criado no exercício 1) para o diretórioBackupno diretório atual. Se o diretórioBackupnão existir, crie-o antes. - Mova o arquivo
dados.txtde dentro deTestepara o diretório atual e renomeie-o paradados_movidos.txt. - Exclua o diretório
Backupe todo o seu conteúdo, mas primeiro verifique se ele existe. Use-WhatIfpara simular a exclusão e depois execute a exclusão real.
New-Item -Path .\Teste -ItemType Directory
New-Item -Path .\Teste\dados.txt -ItemType File -Value "Olá, mundo!"Get-ChildItem -Path C:\Windows -Filter *.txt -Recurse | Where-Object { $_.Length -gt 1KB } | Select-Object Name, @{Name="SizeKB"; Expression={[math]::Round($_.Length / 1KB, 2)}}if (-not (Test-Path .\Backup)) { New-Item -Path .\Backup -ItemType Directory }
Copy-Item -Path .\Teste -Destination .\Backup\Teste -RecurseMove-Item -Path .\Teste\dados.txt -Destination .\dados_movidos.txtif (Test-Path .\Backup) {
Remove-Item -Path .\Backup -Recurse -WhatIf
Remove-Item -Path .\Backup -Recurse
}