Trabalhando com arquivos e pastas

Navegar pelas unidades do PowerShell e manipular os itens nelas é semelhante a manipular arquivos e pastas em unidades de disco do Windows. Este artigo discute como lidar com tarefas de manipulação de arquivos e pastas específicas usando o PowerShell.

Listar todos os arquivos e pastas em uma pasta

Você pode obter todos os itens diretamente em uma pasta usando Get-ChildItem. Adicione o parâmetro opcional Force para exibir itens ocultos ou do sistema. Por exemplo, este comando exibe o conteúdo direto da unidade do PowerShell C:.

Get-ChildItem -Path C:\ -Force

O comando lista apenas os itens contidos diretamente, similar ao uso do comando cmd.exe ou ls de dir em um shell do UNIX. Para mostrar os itens na subpasta, você precisará especificar o parâmetro Recurse. O seguinte comando lista tudo na unidade C::

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem pode filtrar itens com seus parâmetros Path, Filter, Include e Exclude, mas eles normalmente se baseiam apenas no nome. Você pode executar a filtragem complexa com base em outras propriedades de itens usando Where-Object.

O comando a seguir localiza todos os executáveis na pasta Arquivos de Programa que foi modificado após 1º de outubro de 2005 e que não são menores que 1 megabyte nem maiores que 10 megabytes:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

Copiar arquivos e pastas

A cópia é feita com Copy-Item. O seguinte comando faz backup do script de perfil do PowerShell:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

O comando Test-Path verifica se o script de perfil existe.

Se o arquivo de destino já existir, a tentativa de cópia falhará. Para substituir um destino pré-existente, use o parâmetro Force:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

Esse comando funciona mesmo quando o destino é somente leitura.

Copiar a pasta funciona da mesma maneira. Esse comando copia a pasta C:\temp\test1 para a nova pasta C:\temp\DeleteMe recursivamente:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

Você também pode copiar uma seleção de itens. O seguinte comando copia todos os arquivos .txt contidos em qualquer lugar em C:\data para C:\temp\text:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

Você ainda pode executar comandos nativos como xcopy.exe e robocopy.exe para copiar arquivos.

Criar arquivos e pastas

Criar novos itens funciona da mesma forma em todos os provedores do PowerShell. Se um provedor do PowerShell tiver mais de um tipo de item, por exemplo, se o provedor do Sistema de Arquivos do PowerShell fizer distinção entre arquivos e diretórios, você precisará especificar o tipo de item.

Esse comando cria uma pasta C:\temp\New Folder:

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

Esse comando cria um arquivo vazio C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

Importante

Ao usar a opção Force com o comando New-Item para criar uma pasta, e a pasta já existir, ele não substituirá a pasta. Simplesmente retornará o objeto da pasta existente. No entanto, se você usar New-Item -Force em um arquivo que já existe, o arquivo será substituído.

Remover todos os arquivos e pastas dentro de uma pasta

É possível remover os itens contidos usando Remove-Item, mas será solicitado que você confirme a remoção se o item contiver qualquer outra coisa. Por exemplo, se você tentar excluir a pasta C:\temp\DeleteMe que contém outros itens, o PowerShell solicitará sua confirmação antes de excluí-la:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

Se você não quiser ser solicitado para cada item contido, especifique o parâmetro Recurse:

Remove-Item -Path C:\temp\DeleteMe -Recurse

Mapear uma pasta local como uma unidade

Você também pode mapear uma pasta local usando o comando New-PSDrive. O comando a seguir cria uma unidade local P: com raiz no diretório Arquivos de Programa locais, visível somente na sessão do PowerShell:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

Assim como ocorre com unidades de rede, unidades mapeadas no PowerShell ficam visíveis imediatamente para o shell do PowerShell. Para criar uma unidade mapeada visível de Explorador de Arquivos, use o parâmetro Persist. No entanto, somente caminhos remotos podem ser usados com Persist.

Ler um arquivo de texto em uma matriz

Um dos formatos mais comuns de armazenamento para dados de texto é em um arquivo com linhas separadas, tratadas como elementos de dados distintos. O cmdlet Get-Content pode ser usado para ler um arquivo inteiro em uma única etapa, como mostrado aqui:

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

O Get-Content trata os dados lidos do arquivo como uma matriz, com um elemento por linha do conteúdo do arquivo. Você pode confirmar isso verificando o Length do conteúdo retornado:

PS> (Get-Content -Path $PROFILE).Length
3

Esse comando é mais útil para obter listas de informações no PowerShell. Por exemplo, você pode armazenar uma lista de nomes de computador ou de endereços IP em um arquivo C:\temp\domainMembers.txt, com um nome em cada linha do arquivo. Você pode usar Get-Content para recuperar o conteúdo do arquivo e colocá-lo na variável $Computers:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers agora é uma matriz que contém um nome do computador em cada elemento.