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.