Bij het schrijven van PowerShell scripts, zoek ik vaak naar specifieke data, sla die data op in een object en dan exporteer ik het meestal naar CSV formaat. Dit artikel laat zien hoe je dit allemaal kunt doen met behulp van PSObject
.
De eenvoudigste manier die ik vind om gegevens voor een object op te slaan, is door deze op te slaan met behulp van een PSObject
. Als u meerdere objecten hebt waarvoor u gegevens moet opslaan, kunt u elke PSObject
in een matrix opslaan. Deze array kan dan worden geëxporteerd naar CSV.
Een PSObject
lijkt veel op een hashtable waar gegevens worden opgeslagen in key-value paren. U kunt zoveel sleutel-waardeparen maken als u wilt voor elke PSObject
.
Een PSObject
Zoals vermeld, maakt de PowerShell PSObject
gebruik van een structuur van het type sleutel &waardepaar. Om gegevens op te slaan in de PSObject
hoeft u alleen maar een sleutel te definiëren en vervolgens een waarde in de sleutel op te slaan. Het onderstaande voorbeeld maakt een nieuwe PSObject
en slaat wat gegevens op in het object. In dit voorbeeld maken we twee “sleutels” (Key1 en Key2). Elk van deze bevat bits van gegevens over het object (Value1 en Value2).
In een real-life scenario bevatten sleutels en waarden informatie van het beschrijvingstype over het object. Dus als we bijvoorbeeld informatie over een bestand zouden opslaan, zouden sommige van de key-value-paren die we zouden kunnen maken Name, FileExtension, Path, en Size.
Hier volgt hoe u een PSObject
kunt maken in zowel PowerShell 2.0 en 3.0 en hoger:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & boven
In PowerShell 3.0 en hoger, wordt aanbevolen dat u de volgende code gebruikt om een PSObject
te maken. Dit komt omdat het de volgorde van elke gemaakte sleutelwaarde handhaaft, wat betekent dat bij het exporteren naar CSV de sorteervolgorde wordt gehandhaafd.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Opslaan van meerdere PSObjecten in een array
Tot nu toe hebben we gekeken naar het opslaan van informatie over een enkel object (bijv. een bestand). Wat als we een map opsommen en informatie moeten opslaan over alle bestanden in de map? In dat geval zouden we een PSObject
maken voor elk bestand (om zijn individuele gegevens op te slaan) en dan zouden we al deze PSObjecten opslaan in een array. Dit maakt het heel gemakkelijk om informatie voor meerdere objecten op te slaan en te exporteren.
Hier ziet u hoe u een PSObject in een matrix opslaat. Om dit voor meerdere bestanden te doen, doe je dit in de ForEach
loop:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Een voorbeeld uit de echte wereld
Laten we een snel voorbeeld maken om te helpen met de demonstratie. In dit voorbeeld gaan we het volgende doen:
Een tekstbestand lezen dat een lijst met werknemersnamen bevat. Voor elke naam zoeken we ze op in AD en verzamelen we wat aanvullende informatie, waaronder gebruikersnaam en emailadres. Vervolgens worden deze gegevens uitgevoerd naar CSV.
Voorbeeldoplossing
Het onderstaande script somt alle werknemersnamen in het tekstbestand op en doorzoekt voor elke naam de aanvullende werknemersgegevens in AD. Elk van deze gegevens wordt opgeslagen in een eigen PSObject met de naam $hItemDetails
.
Om ervoor te zorgen dat de gegevens in de juiste volgorde staan wanneer ze naar CSV worden geëxporteerd, gebruiken we de @{}
-methode voor het maken van een nieuwe PSObject
(alleen beschikbaar in PowerShell 3.0 en hoger). Tenslotte, aangezien er meerdere werknemers zijn, sla ik elk PSObject op in een array genaamd $aResults
. Deze array wordt vervolgens geëxporteerd naar CSV.
Import-Module ActiveDirectory$aResults = @()$List = Get-Content "C:\Temp\List.txt" ForEach ($Item in $List) { $Item = $Item.Trim() $User = Get-ADUser -Filter { displayName -like $Item -and SamAccountName -notlike "a-*" -and Enabled -eq $True } -Properties SamAccountName, GivenName, Surname, telephoneNumber $sEmail = $User.GivenName + "." + $User.Surname + "@test.com" $hItemDetails = @ { FullName = $Item UserName = $User.SamAccountName Email = $sEmail Tel = $User.telephoneNumber } #Add data to array $aResults += $hItemDetails}$aResults | Export-CSV "C:\Temp\Results.csv"