A PowerShell szkriptek írása során gyakran keresek bizonyos adatokat, ezeket az adatokat egy objektumban tárolom, majd legtöbbször CSV formátumba exportálom. Ez a cikk bemutatja, hogyan lehet mindezt a PSObject használatával elvégezni.

Az adatok tárolásának legegyszerűbb módját egy objektum esetében egy PSObject segítségével találom. Ha több objektummal rendelkezik, amelyekhez adatokat kell tárolnia, akkor az egyes PSObject-eket egy tömbben tárolhatja. Ez a tömb ezután CSV-be exportálható.

A PSObject nagyon hasonlít egy hashtable-re, ahol az adatok kulcs-érték párokban tárolódnak. Minden PSObject-hez annyi kulcs-értékpárt hozhat létre, amennyit csak akar.

PSObject létrehozása

Amint említettük, a PowerShell PSObject egy kulcs & értékpár típusú szerkezetet használ. Az adatok PSObject-ben való tárolásához csak egy kulcsot kell definiálni, majd a kulcsban egy értéket kell tárolni. Az alábbi példák egy új PSObject-t hoznak létre, és néhány adatot tárolnak az objektumban. Ebben a példában két “kulcsot” hozunk létre (Key1 és Key2). Ezek mindegyike bitnyi adatot tartalmaz az objektumról (Value1 és Value2).

A valós életben a kulcsok és az értékek leíró jellegű információkat tartalmaznak az objektumról. Így például, ha egy fájlról tárolnánk információt, néhány kulcs-érték pár, amit létrehozhatnánk, a következők lennének: Name, FileExtension, Path és Size.

Itt látható, hogyan hozzunk létre egy PSObject-t mind a PowerShell 2-ben.0 és a 3.0 és magasabb verzióban:

PowerShell 2.0

$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}

PowerShell 3.0 & felett

A PowerShell 3.0 és magasabb verzióban a következő kódot ajánlott használni a PSObject létrehozásához. Ez azért van így, mert ez fenntartja az egyes létrehozott kulcsértékek sorrendjét, ami azt jelenti, hogy a CSV-be történő exportáláskor a rendezési sorrend megmarad.

$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}

Minden PSObjektum tárolása egy tömbben

Ezidáig egyetlen objektumra (például egy fájlra) vonatkozó információk tárolását vizsgáltuk. Mi van akkor, ha egy mappát sorolunk fel, és a mappában lévő összes fájlról információt kell tárolnunk? Ebben az esetben minden egyes fájlhoz létrehoznánk egy PSObject-t (az egyedi adatok tárolására), majd az összes ilyen PSObjektumot egy tömbben tárolnánk. Ez nagyon megkönnyíti a több objektumra vonatkozó információk tárolását és exportálását.

Íme, így tárolhatunk egy PSObjectet egy tömbben. Ahhoz, hogy ezt több fájl esetében is megtehessük, csak a ForEach cikluson belül kell ezt tennünk:

# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject

Egy valós példa

Állítsunk fel egy gyors példát, hogy segítsük a szemléltetést. Ebben a példában a következőket fogjuk csinálni:

Egy szöveges fájl beolvasása, amely az alkalmazottak neveinek listáját tartalmazza. Minden egyes névre rákeresünk az AD-ben, és összegyűjtünk néhány további információt, beleértve a felhasználónevet és az e-mail címet. Ezt követően ezeket az adatokat CSV formátumban adjuk ki.

Példa megoldás

Az alábbi szkript felsorolja az összes alkalmazott nevét a szöveges fájlban, és mindegyikük esetében rákeres az AD-ben a további alkalmazotti információkra. Mindegyik adatot egy saját, $hItemDetails nevű PSObjectben tárolja.

Az adatok CSV-be történő exportálásakor a helyes sorrend biztosítása érdekében egy új PSObject létrehozásának @{} módszerét használjuk (csak a PowerShell 3.0 és újabb verziókban érhető el). Végül, mivel több alkalmazott van, minden PSObjectet egy $aResults nevű tömbben tárolok. Ezt a tömböt ezután CSV-be exportálom.

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"

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.