Navegar pelas unidades do Windows PowerShell e manipular os itens contidos ali é similar à manipulação de arquivos e pastas das unidades de disco do Windows. Discutiremos como podemos lidar com tarefas específicas da manipulação de arquivos e pastas nesta seção.

Listando todos os arquivos e pastas de uma pasta

Você pode obter todos os itens contidos em uma pasta usando Get-ChildItem. Para exibir itens ocultos ou do sistema, adicione o parâmetro opcional Force. Por exemplo, este comando exibe o conteúdo direto da Unidade C do Windows PowerShell (que é a mesma unidade C física do Windows):

Get-ChildItem -Force C:\

O comando lista somente os itens diretamente contidos, como faz o comando DIR do Cmd.exe ou o ls em um shell do UNIX. Para exibir os itens contidos, você também precisa especificar o parâmetro -Recurse. (Esse processo pode demorar muito para ser concluído.) Para listar todo o conteúdo da unidade C:

Get-ChildItem -Force C:\ -Recurse

Get-ChildItem pode filtrar itens com os parâmetros Path, Filter, Includee Exclude, mas esses parâmetros geralmente se baseiam apenas no nome. Você pode executar a filtragem complexa baseada em outras propriedades de itens usando Where-Object.

O comando a seguir encontra todos os executáveis da pasta Program Files modificados depois de 1o de outubro de 2005 e que não sejam nem menores do que 1 megabyte nem maiores do que 10 megabytes:

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

Copiando arquivos e pastas

A cópia é feita com Copy-Item. O comando a seguir faz o backup de C:\boot.ini em C:\boot.bak:

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak

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

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force

Esse comando funciona mesmo quando o destino é somente leitura.

A cópia de pastas funciona da mesma maneira. Este comando copia de forma recursiva a pasta C:\temp\test1 para a nova pasta c:\temp\DeleteMe:

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 arquivos .txt contidos em qualquer local de c:\data para c:\temp\text:

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

Você ainda pode usar outras ferramentas para fazer cópias no sistema de arquivos. XCOPY, ROBOCOPY e objetos COM, como Scripting.FileSystemObject, funcionam no Windows PowerShell. Por exemplo, você pode usar a classe Scripting.FileSystem COM do Windows Script Host para fazer backup de C:\boot.ini em C:\boot.bak:

(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")

Criando arquivos e pastas

A criação de novos itens funciona da mesma forma em todos os provedores do Windows PowerShell. Se um provedor do Windows PowerShell tiver mais de um tipo de item – por exemplo, o provedor FileSystem do Windows PowerShell faz a distinção de diretórios e arquivos – você terá de especificar o tipo do 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"

Removendo todos os arquivos e pastas de uma pasta

Você pode remover os itens contidos usando Remove-Item, mas terá de confirmar a remoção caso o item contenha algo mais. Por exemplo, se você tentar excluir a pasta C:\temp\DeleteMe, que contém outros itens, o Windows PowerShell solicita a confirmação antes de excluir a pasta:

Remove-Item C:\temp\DeleteMe

Confirm
The item at C:\temp\DeleteMe has children and the -recurse parameter was not
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"):

Caso você não queira que haja uma solicitação para cada item contido, especifique o parâmetro Recurse:

Remove-Item C:\temp\DeleteMe -Recurse

Mapeando uma pasta local como uma unidade acessível do Windows

Você também pode mapear uma pasta local usando o comando subst. O comando a seguir cria um unidade local P: com raiz no diretório local Arquivos de Programas:

subst p: $env:programfiles

Assim como acontece com as unidades de rede, as unidades mapeadas no Windows PowerShell com subst ficam imediatamente visíveis no shell do Windows PowerShell.

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 cmdlet Get-Content pode ser usado para ler todo o arquivo de uma só vez, como mostrado aqui:

PS> Get-Content -Path C:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
 /noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional 
with Data Execution Prevention" /noexecute=optin /fastdetect

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

PS> (Get-Content -Path C:\boot.ini).Length
6

Esse comando é mais útil para a inserção de listas de informação diretamente no Windows PowerShell. Por exemplo, você poderia armazenar uma lista de nomes de computadores 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 de computador em cada elemento.




Sumário