Get-ChildItem: Listar Arquivos e Pastas com PowerShell

Lembra dos bons tempos do comando dir no DOS? E o comando ls no Linux? Se sim, o Get-childItem é essencialmente isso, mas levado a um nível superior.

Na verdade, até mesmo temos os comandos dir e ls no PowerShell na forma de um alias. O cmdlet Get-Childitem do PowerShell não só pode listar arquivos e pastas em um sistema de arquivos via console do PowerShell 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 no Active Directory, para citar alguns.

Se você é um scripter iniciante/intermediário do PowerShell, não deixe de conferir meu mini-curso GRATUITO sobre como construir uma ferramenta do PowerShell! São mais de 9.000 palavras de explicação aprofundada 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.

Dado que este 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 este comando para caminhos locais no computador local, usar um script remoto do PowerShell e usar Get-ChildItem dentro dele ou simplesmente apontá-lo para um caminho UNC. Todos funcionam da mesma forma. 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

Microsoft percebeu que navegar por essa estrutura em forma de “árvore” de um sistema de arquivos poderia ser aplicado a outros sistemas também. Um sistema de arquivos em forma de “árvore” possui pastas e arquivos, mas um registro possui 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, assim nasceu o provedor do PowerShell. Por que toda essa conversa sobre provedores do PowerShell? Porque o cmdlet Get-ChildItem faz parte dos cmdlets *-Item que interagem com os drives do PowerShell que cada provedor expõe.

O cmdlet Get-ChildItem pode produzir qualquer número de objetos em um drive do PowerShell e permite que você processe cada item através do pipeline ou talvez em um loop foreach do PowerShell. Ele compreende o conceito de um drive 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ó.

Você pode ver abaixo que este comando pode enumerar a pasta C:\, a hive HKEY Current User, bem como 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 Get-ChildItem do PowerShell não pode apenas puxar todos os objetos em um disco, mas também pode filtrar as informações por meio 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 do filtro para o provedor individual. Embora muito mais rápido, essa sintaxe depende exclusivamente do provedor que está sendo consultado.

Por exemplo, uma sintaxe de filtro 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 tem 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

Quando tudo o 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 exibirá arquivos e pastas ocultos, File e Directory, que só encontram arquivos ou pastas. Dê uma olhada na descrição completa do Get-ChildItem via Get-Help ou nos documentos da Microsoft.

Outra coisa legal sobre o 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 de arquivo .txt, basta especificar o caminho para a pasta e *.txt.

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

Podemos também filtrar pelos atributos do arquivo. Talvez queiramos apenas encontrar os arquivos somente leitura em uma pasta.

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

Resumo

Este comando do PowerShell é um daqueles cmdlets que você usará repetidamente. Na maioria das vezes, 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 o Get-ChildItem pode consultar para você.

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