När jag skriver PowerShell-skript söker jag ofta efter specifika data, lagrar dessa data i ett objekt och exporterar dem sedan oftast till CSV-format. Den här artikeln visar hur du gör allt detta med hjälp av PSObject
.
Det enklaste sättet som jag finner att lagra data för ett objekt är att lagra det med hjälp av en PSObject
. Om du har flera objekt som du behöver lagra data för kan du sedan lagra varje PSObject
i en array. Denna array kan sedan exporteras till CSV.
En PSObject
påminner mycket om en hashtable där data lagras i nyckel-värdepar. Du kan skapa så många nyckel-värdepar som du vill för varje PSObject
.
Skapa ett PSObject
Som nämnts använder PowerShell PSObject
en struktur av typen nyckel &värdepar. För att lagra data i PSObject
behöver du bara definiera en nyckel och sedan lagra ett värde i nyckeln. Exemplen nedan skapar en ny PSObject
och lagrar några data i objektet. I det här exemplet skapar vi två ”nycklar” (Key1 och Key2). Var och en av dessa innehåller bitar av data om objektet (Value1 och Value2).
I ett verkligt scenario innehåller nycklar och värden information av beskrivningstyp om objektet. Så om vi till exempel lagrar information om en fil skulle några av de nyckel-värdepar vi skulle kunna skapa vara Name, FileExtension, Path och Size.
Här beskrivs hur man skapar en PSObject
i både PowerShell 2.0 och 3.0 och senare:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & senare
I PowerShell 3.0 och senare rekommenderas att du använder följande kod för att skapa en PSObject
. Detta beror på att den upprätthåller ordningen för varje nyckelvärde som skapas, vilket innebär att sorteringsordningen bibehålls när du exporterar till CSV.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Lagring av flera PSOobjekt i en array
Sedan tidigare har vi tittat på att lagra information om ett enda objekt (t.ex. en fil). Vad händer om vi räknar upp en mapp och behöver lagra information om alla filer i mappen? I det fallet skulle vi skapa ett PSObject
för varje fil (för att lagra dess individuella data) och sedan lagra alla dessa PSObjects i en array. Detta gör det väldigt enkelt att lagra och exportera information för flera objekt.
Här ser du hur du lagrar ett PSObjekt i en array. För att göra detta för flera filer gör du bara så här inne i ForEach
-slingan:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Ett exempel från den verkliga världen
Låt oss ställa in ett snabbt exempel för att hjälpa till med demonstrationen. I det här exemplet ska vi göra följande:
Läsning av en textfil som innehåller en lista med namn på anställda. För varje namn kommer vi att söka upp dem i AD och samla in ytterligare information, inklusive användarnamn och e-postadress. Vi kommer sedan att skriva ut dessa data till CSV.
Exempel på lösning
Skriptet nedan räknar upp alla namnen på de anställda i textfilen och söker för varje namn i AD efter ytterligare information om den anställde. Var och en av dessa uppgifter lagras i ett eget PSObject som heter $hItemDetails
.
För att säkerställa att uppgifterna är i rätt ordning när de exporteras till CSV använder vi @{}
-metoden för att skapa ett nytt PSObject
(endast tillgänglig i PowerShell 3.0 och senare). Eftersom det finns flera anställda lagrar jag slutligen varje PSObjekt i en array som heter $aResults
. Denna array exporteras sedan till 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"