Når jeg skriver PowerShell-scripts, søger jeg ofte efter specifikke data, gemmer disse data i et objekt og eksporterer dem derefter oftest til CSV-format. Denne artikel viser dig, hvordan du kan gøre alt dette ved hjælp af PSObject
.
Den nemmeste måde, jeg finder at gemme data for et objekt på, er at gemme dem ved hjælp af en PSObject
. Hvis du har flere objekter, du har brug for at gemme data for, kan du derefter gemme hver PSObject
i et array. Dette array kan derefter eksporteres til CSV.
En PSObject
minder meget om en hashtabel, hvor data gemmes i nøgle-værdipar. Du kan oprette så mange nøgle-værdipar, som du vil, for hver PSObject
.
Skabelse af et PSObject
Som nævnt bruger PowerShell PSObject
en struktur af typen nøgle &værdipar. Hvis du vil gemme data i PSObject
, skal du blot definere en nøgle og derefter gemme en værdi i nøglen. Eksemplerne nedenfor opretter en ny PSObject
og gemmer nogle data i objektet. I dette eksempel opretter vi to “nøgler” (Key1 og Key2). Hver af disse indeholder bits af data om objektet (Value1 og Value2).
I et virkeligt scenarie indeholder nøgler og værdier oplysninger af beskrivelsestypen om objektet. Så hvis vi f.eks. lagrede oplysninger om en fil, ville nogle af de nøgle-værdipar, vi kunne oprette, være Navn, FileExtension, Sti og Størrelse.
Her er hvordan man opretter en PSObject
i både PowerShell 2.0 og 3.0 og derover:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & over
I PowerShell 3.0 og derover anbefales det, at du bruger følgende kode til at oprette en PSObject
. Dette skyldes, at den opretholder rækkefølgen af hver nøgleværdi, der oprettes, hvilket betyder, at sorteringsrækkefølgen opretholdes, når du eksporterer til CSV.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Lagring af flere PSObjekter i et array
Så vidt vi har set på lagring af oplysninger om et enkelt objekt (f.eks. en fil). Hvad nu, hvis vi opregner en mappe og skal gemme oplysninger om alle filerne i mappen? I så fald ville vi oprette en PSObject
for hver fil (for at gemme dens individuelle data), og derefter ville vi gemme alle disse PSOobjekter i et array. Dette gør det virkelig nemt at gemme og eksportere oplysninger om flere objekter.
Her er vist, hvordan du gemmer et PSObject i et array. Hvis du vil gøre dette for flere filer, skal du blot gøre dette inde i ForEach
-loopet:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Et eksempel fra den virkelige verden
Lad os opstille et hurtigt eksempel for at hjælpe med demonstrationen. I dette eksempel gør vi følgende:
Læser en tekstfil, der indeholder en liste over medarbejdernavne. For hvert navn vil vi slå dem op i AD og indsamle nogle yderligere oplysninger, herunder brugernavn og e-mailadresse. Vi vil derefter udskrive disse data til CSV.
Eksempel på løsning
Scriptet nedenfor opregner alle medarbejdernavne i tekstfilen og søger for hver enkelt i AD efter deres yderligere medarbejderoplysninger. Hver af disse data gemmes i sit eget PSObject kaldet $hItemDetails
.
For at sikre, at dataene er i den korrekte rækkefølge, når de eksporteres til CSV, bruger vi @{}
-metoden til at oprette et nyt PSObject
(kun tilgængelig i PowerShell 3.0 og nyere). Endelig, da der er flere medarbejdere, gemmer jeg hvert PSObject i et array kaldet $aResults
. Dette array eksporteres derefter til 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"