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-ChildItemo . 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-Objecto .

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:\dataC:\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.