Trabalhar com ficheiros e pastas
Navegar pelas unidades do PowerShell e manipular os itens nelas é semelhante à manipulação de arquivos e pastas em unidades de disco do Windows. Este artigo discute como lidar com tarefas específicas de manipulação de arquivos e pastas usando o PowerShell.
Listando todos os arquivos e pastas dentro de uma pasta
Você pode obter todos os itens diretamente dentro de uma pasta usando Get-ChildItem
o . Adicione o parâmetro Force opcional para exibir itens ocultos ou do sistema. Por exemplo, este comando exibe o conteúdo direto do PowerShell Drive C:
.
Get-ChildItem -Path C:\ -Force
O comando lista apenas os itens contidos diretamente, muito parecido com o uso do dir
comando em cmd.exe
ou ls
em um shell UNIX. Para mostrar itens na subpasta, você precisa especificar o parâmetro Recurse .
O comando a seguir lista tudo na C:
unidade:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItem
pode filtrar itens com seus parâmetros Path, Filter, Include e Exclude , mas esses parâmetros normalmente são baseados apenas no nome. Você pode executar filtragem complexa com base em outras propriedades de itens usando Where-Object
o .
O comando a seguir localiza todos os executáveis dentro da pasta Arquivos de Programas que foram modificados pela última vez 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 ficheiros e pastas
A cópia é feita com Copy-Item
. O comando a seguir faz backup do script de perfil do PowerShell:
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}
O Test-Path
comando 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
}
Este comando funciona mesmo quando o destino é somente leitura.
A cópia de pastas funciona da mesma forma. Este 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 comando a seguir copia todos os .txt
arquivos contidos em qualquer lugar para C:\data
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.
Criação de ficheiros e pastas
A criação de 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, o provedor do PowerShell do Sistema de Arquivos distingue entre diretórios e arquivos — você precisará especificar o tipo de item.
Este comando cria uma nova pasta C:\temp\New Folder
:
New-Item -Path 'C:\temp\New Folder' -ItemType Directory
Este comando cria um novo 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 New-Item
comando para criar uma pasta, e a pasta já existir, ela não substituirá ou substituirá a pasta. Ele simplesmente retornará o objeto de pasta existente. No entanto, se você usar New-Item -Force
em um arquivo que já existe, o arquivo será substituído.
Removendo todos os arquivos e pastas dentro de uma pasta
Você pode remover itens contidos usando Remove-Item
, mas será solicitado que confirme a remoção se o item contiver mais alguma coisa. Por exemplo, se você tentar excluir a pasta C:\temp\DeleteMe
que contém outros itens, o PowerShell solicitará a confirmação antes de excluir a pasta:
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
Mapeando uma pasta local como uma unidade
Você também pode mapear uma pasta local, usando o New-PSDrive
comando. O comando a seguir cria uma unidade P:
local enraizada no diretório Arquivos de Programas local, visível somente da sessão do PowerShell:
New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem
Assim como nas unidades de rede, as unidades mapeadas no PowerShell ficam imediatamente visíveis para o shell do PowerShell. Para criar uma unidade mapeada visível a partir do Explorador de Ficheiros, utilize o parâmetro Persist . No entanto, apenas caminhos remotos podem ser usados com Persist.
Lendo um arquivo de texto em uma matriz
Um dos formatos de armazenamento mais comuns para dados de texto é em um arquivo com linhas separadas tratadas como elementos de dados distintos. O Get-Content
cmdlet pode ser usado para ler um arquivo inteiro em uma etapa, conforme 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
Get-Content
Trata os dados lidos do arquivo como uma matriz, com um elemento por linha de conteúdo do arquivo. Você pode confirmar isso verificando o Comprimento do conteúdo retornado:
PS> (Get-Content -Path $PROFILE).Length
3
Este comando é mais útil para obter listas de informações no PowerShell. Por exemplo, você pode armazenar uma lista de nomes de computador ou endereços IP no 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á-los na variável $Computers
:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers
é agora uma matriz que contém um nome de computador em cada elemento.