Manipulando arquivos e pastas
Nesta aula, você aprenderá a manipular arquivos e pastas no PowerShell usando cmdlets essenciais como Get-ChildItem, Copy-Item, Move-Item, Remove-Item, Test-Path e New-Item. Através de exemplos práticos, você dominará listagem, criação, cópia, movimentação, remoção e verificação de existência de itens no sistema de arquivos.
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 -NameUm 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 -ForceMove-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\MinhaPastaRemove-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 LeafVocê 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 -ForceO 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-Pathantes de operações críticas. - Usar
-WhatIfem 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
- Crie uma pasta chamada
Testeno diretório atual e, dentro dela, crie um arquivo vazio chamadodados.txt. Em seguida, liste o conteúdo da pasta para confirmar. - Copie o arquivo
dados.txtpara um novo arquivo chamadocopia.txtdentro da mesma pastaTeste. Depois, verifique se ambos existem usandoTest-Path. - Mova o arquivo
copia.txtpara o diretório pai (um nível acima). Verifique se ele não está mais na pasta original. - Remova o arquivo
dados.txtda pastaTesteusandoRemove-Iteme depois confirme que ele não existe mais. - Liste todos os arquivos (somente arquivos, não pastas) no diretório atual e subpastas que tenham extensão
.txte que sejam maiores que 1 KB. UseGet-ChildItemcom-Recursee-Filter.
New-Item -Path .\Teste -ItemType Directory -Force
New-Item -Path .\Teste\dados.txt -ItemType File -Force
Get-ChildItem -Path .\TesteCopy-Item -Path .\Teste\dados.txt -Destination .\Teste\copia.txt
Test-Path .\Teste\dados.txt
Test-Path .\Teste\copia.txtMove-Item -Path .\Teste\copia.txt -Destination .\copia.txt
Test-Path .\Teste\copia.txt
Test-Path .\copia.txtRemove-Item -Path .\Teste\dados.txt
Test-Path .\Teste\dados.txtGet-ChildItem -Recurse -Filter *.txt | Where-Object { $_.Length -gt 1KB }