Get-ChildItem: Listar Arquivos e Pastas com PowerShell

Lembram-se dos bons e velhos dias do comando dir do DOS? E o comando ls do Linux? Se sim, o Get-ChildItem é basicamente isso, mas elevado a um nível superior.

Na verdade, temos até mesmo os comandos dir e ls no PowerShell na forma de um alias. O cmdlet Get-ChildItem do PowerShell não apenas pode listar arquivos e pastas em um sistema de arquivos por meio do console ou script do PowerShell, mas também pode enumerar chaves e valores do registro, certificados em vários repositórios de certificados e até mesmo o Active Directory, para citar alguns.

Se você é um iniciante/intermediário em script do PowerShell, não deixe de conferir meu mini-curso GRATUITO sobre a criação de uma ferramenta do PowerShell! Mais de 9.000 palavras de explicações detalhadas e insights sobre como construir uma ferramenta do PowerShell.

Para entender o Get-ChildItem, primeiro pense nele em relação ao dir e ls, mas em vez de apenas arquivos, ele trata muitos objetos como um item filho e os enumera. Você pode usar o alias ou o nome completo do comando para utilizá-lo.

Como esse comando está disponível desde o PowerShell v1, você pode ter certeza de que ele funcionará com sua versão do PowerShell.

Get-ChildItem percorre uma árvore

A file system is a hierarchy. It has a folder structure with files inside of folders and those folders inside of other folders. A file system is like a tree. That tree has a trunk (C:\ for example) and “branches” coming off of it (folders). In fact, we even have a tree command.

PS> tree
Folder PATH listing for volume HD
Volume serial number is 0000007B 22DC:666C
C:.
 \modules
   \AdsiPS
     \1.0.0.2
       \Public
       \AWSPowerShell
<SNIP>

Você pode direcionar esse comando para caminhos locais no computador local, usar um bloco de script remoto do PowerShell e usar o Get-ChildItem dentro dele ou apenas apontá-lo para um caminho UNC. Todos funcionam da mesma maneira. Talvez eu queira listar todos os arquivos no diretório atual.

PS> dir -Path .
PS> Invoke-Command -ComputerName SERVER1 -Scriptblock { dir -Path . }

Provedores do PowerShell

A Microsoft percebeu que a navegação nessa estrutura de “árvore” de um sistema de arquivos poderia ser aplicada a outros sistemas também. Um sistema de arquivos “em árvore” possui pastas e arquivos, mas um registro tem chaves e valores, enquanto o sistema de certificados no Windows possui repositórios e certificados dentro desses repositórios. Cada uma dessas áreas específicas pode ser representada como uma árvore, e assim nasceu o provedor PowerShell. Por que toda essa conversa sobre provedores do PowerShell? Porque o cmdlet Get-ChildItem faz parte dos cmdlets *-Item que interagem com as unidades do PowerShell que cada provedor expõe.

O cmdlet Get-ChildItem pode produzir qualquer número de objetos em uma unidade do PowerShell e permite que você processe cada item por meio do pipeline ou talvez em um loop foreach do PowerShell. Ele compreende o conceito de uma unidade do PowerShell, o que permite que você especifique um Path de uma pasta do sistema de arquivos, uma chave do registro ou um repositório de certificados, tudo em um só.

Como pode ser visto abaixo, este comando pode enumerar a pasta C:\, a chave do usuário atual (HKEY Current User) e também o repositório de certificados do PowerShell.

PS> Get-ChildItem -Path C:\


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         7/2/2017   7:01 AM                AppData
d-----        4/25/2017   4:36 PM                CheckPoint

PS> Get-ChildItem -Path HKCU:\


    Hive: HKEY_CURRENT_USER


Name                           Property
----                           --------
BCD00000000

PS> dir -Path Cert:\


Location   : CurrentUser
StoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}

Filtragem

O comando PowerShell Get-ChildItem não apenas pode recuperar todos os objetos em um disco, mas também pode filtrar as informações através de alguns parâmetros diferentes: Filter, Include e Exclude. Você sempre vai querer usar o onipresente parâmetro Filter do PowerShell quando possível. Este parâmetro passa diretamente a sintaxe de filtro para o provedor individual. Embora seja muito mais rápido, essa sintaxe depende exclusivamente do provedor sendo consultado.

Por exemplo, uma sintaxe de Filter como Name -eq 'foo' pode ser completamente aceitável ao consultar arquivos, mas não funcionará de jeito nenhum ao consultar o registro porque o provedor do registro nem sequer possui um filtro!

PS> dir HKLM:\ -Filter "Name -eq 'foo'"
ls : Cannot call method. The provider does not support the use of filters.
At line:1 char:1 + ls HKLM:\ -Filter "Name -eq 'foo'" +
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo          :
NotImplemented: (:) [Get-ChildItem], PSNotSupportedException     +
FullyQualifiedErrorId :
NotSupported,Microsoft.PowerShell.Commands.GetChildItemCommand

No entanto, quando tudo mais falhar, você sempre terá os parâmetros Include e Exclude também.

Este comando no PowerShell também possui alguns parâmetros específicos do sistema de arquivos como Force, que irá mostrar arquivos e pastas ocultos, File e Directory, que apenas encontram arquivos ou pastas. Dê uma olhada na descrição completa de Get-ChildItem via Get-Help ou na documentação da Microsoft.

Outra coisa legal sobre Get-ChildItem é sua capacidade de resolver caminhos ao usar o caractere curinga. No PowerShell, o caractere curinga normalmente representa qualquer coisa. Por exemplo, se você quiser ver todos os arquivos com a extensão .txt, basta especificar o caminho para a pasta e *.txt.

PS> Get-ChildItem -Path 'C:\*.txt'

Nós também poderíamos filtrar pelos atributos do arquivo. Talvez só queiramos encontrar os arquivos somente leitura em uma pasta.

PS> Get-ChildItem -Path C:\ -Attributes R -File

Resumo

Este comando PowerShell é um daqueles cmdlets que você usará repetidamente. Na maior parte do tempo, você provavelmente estará usando o provedor FileSystem, mas é importante lembrar que este cmdlet é capaz de fazer muito mais. Use-o para consultar arquivos, pastas, chaves de registro, valores de registro, certificados, usuários do Active Directory, computadores ou até mesmo variáveis de ambiente, funções e muito mais!

Em caso de dúvida, execute o comando Get-PSDrive para ver uma lista de todas as unidades do PowerShell carregadas que Get-ChildItem pode consultar para você.

Source:
https://adamtheautomator.com/get-childitem/