Get-ChildItem: Lijst met bestanden en mappen met PowerShell

Herinner je je de goede oude dagen van het DOS dir-commando? Wat dacht je van het Linux ls-commando? Zo ja, is de Get-childItem in feite dat, maar dan naar een hoger niveau getild.

Sterker nog, we hebben zelfs dir en ls in PowerShell in de vorm van een alias. De Get-Childitem PowerShell-cmdlet kan niet alleen bestanden en mappen op een bestandssysteem via de PowerShell-console of PowerShell script weergeven, maar kan ook registerkeys en -waarden, certificaten in verschillende certificaatopslagplaatsen en zelfs Active Directory opnoemen, om er maar een paar te noemen.

Als je een beginnende/intermediaire PowerShell-scripter bent, zorg er dan voor dat je mijn GRATIS mini-cursus over het bouwen van een PowerShell-tool bekijkt! 9.000+ woorden diepgaande uitleg en inzichten over hoe je een PowerShell-tool kunt bouwen.

Om Get-Childitem te begrijpen, denk er eerst aan in termen van dir en ls, maar in plaats van alleen bestanden behandelt het veel objecten als een kinditem en nummert ze op. Je kunt de alias of de volledige commandonaam gebruiken om het te gebruiken.

Aangezien dit commando beschikbaar is sinds PowerShell v1, kun je er zeker van zijn dat het werkt met jouw PowerShell-versie.

Get-ChildItem doorzoekt een boom

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>

Je kunt dit commando richten op lokale paden op de lokale computer, een PowerShell externe scriptblok gebruiken en Get-ChildItem daarin gebruiken, of het gewoon richten op een UNC-pad. Allemaal werken ze hetzelfde. Misschien wil ik gewoon alle bestanden in de huidige map weergeven.

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

PowerShell-providers

Microsoft besefte dat het navigeren door deze “boom”-achtige structuur van een bestandssysteem ook kon worden toegepast op andere systemen. Een bestandssysteem “boom” heeft mappen en bestanden, maar een register heeft sleutels en waarden, terwijl het certificaatsysteem in Windows winkels en certificaten binnen die winkels heeft. Elk van deze specifieke gebieden kan allemaal worden voorgesteld als een boom, en zo werd de PowerShell-provider geboren. Waarom al deze praatjes over PowerShell-providers? Omdat de Get-ChildItem-cmdlet deel uitmaakt van de *-Item-cmdlets die interageren met PowerShell-drives die elke provider blootstelt.

De Get-ChildItem-cmdlet kan elk aantal objecten op een PowerShell-drive produceren en stelt u in staat elk item te verwerken via de pijplijn of misschien in een PowerShell foreach-lus. Het begrijpt het concept van een PowerShell-drive, waarmee u een Path van een bestandssysteemmap, een registerkey of een certificaatopslag allemaal in één keer kunt specificeren.

U kunt hieronder zien dat deze opdracht de C:\-map, de HKEY Current User-hive en ook de PowerShell-certificaatopslag kan opsommen.

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...}

Filtering

De PowerShell-opdracht Get-ChildItem kan niet alleen alle objecten op een schijf ophalen, maar kan ook de informatie filteren via verschillende parameters: Filter, Include en Exclude. Je zult altijd de alomtegenwoordige PowerShell Filter-parameter willen gebruiken wanneer mogelijk. Deze parameter geeft de filter-syntax rechtstreeks door aan de individuele provider. Hoewel veel sneller, is deze syntax volledig afhankelijk van de provider die wordt bevraagd.

Bijvoorbeeld, een Filter-syntax van Name -eq 'foo' kan prima werken bij het bevragen van bestanden, maar werkt helemaal niet bij het bevragen van het register omdat de registerprovider zelfs geen filter heeft!

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

Als alle andere pogingen echter mislukken, heb je altijd nog de Include en Exclude parameters.

Deze opdracht in PowerShell heeft ook enkele bestandssysteemspecifieke parameters zoals Force die verborgen bestanden en mappen weergeeft, File en Directory die alleen bestanden of mappen vinden. Bekijk de volledige uitleg van Get-ChildItem via Get-Help of in de Microsoft-documentatie.

Nog iets interessants aan Get-ChildItem is de mogelijkheid om paden op te lossen bij gebruik van het wildcard-teken. In PowerShell vertegenwoordigt het wildcard-teken meestal alles. Als je bijvoorbeeld alle bestanden met de extensie .txt wilt zien, geef dan gewoon het pad naar de map op en *.txt.

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

We zouden ook kunnen filteren op bestandsattributen. Misschien willen we alleen de alleen-lezen bestanden in een map vinden.

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

Samenvatting

Deze PowerShell-opdracht is een van die cmdlets die je herhaaldelijk zult gebruiken. Meestal gebruik je waarschijnlijk de FileSystem-provider, maar het is belangrijk te onthouden dat deze cmdlet veel meer kan. Gebruik het om bestanden, mappen, registervermeldingen, registerwaarden, certificaten, Active Directory-gebruikers, computers of zelfs omgevingsvariabelen, functies en meer te bevragen!

Bij twijfel voer je de Get-PSDrive-opdracht uit om een lijst van alle geladen PowerShell-drives te zien die Get-ChildItem voor je kan bevragen.

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