Kirjoittaessani PowerShell-skriptejä etsin usein tiettyjä tietoja, tallennan ne objektiin ja vien ne useimmiten CSV-muotoon. Tässä artikkelissa näytetään, miten tämä kaikki tehdään PSObject:n avulla.

Helpoisin tapa tallentaa tietoja objektille on mielestäni tallentaa ne PSObject:n avulla. Jos sinulla on useita objekteja, joiden tiedot haluat tallentaa, voit tallentaa jokaisen PSObject:n arrayyn. Tämä array voidaan sitten viedä CSV-muotoon.

PSObject muistuttaa hyvin paljon hashtable-taulukkoa, jossa tiedot tallennetaan avain-arvopareina. Voit luoda kullekin PSObject:lle niin monta avain-arvoparia kuin haluat.

PSObjectin luominen

Kuten mainittiin, PowerShellin PSObject käyttää avain & arvopari -tyyppistä rakennetta. Tallentaaksesi tietoja PSObject:ään sinun tarvitsee vain määritellä avain ja tallentaa sitten arvo avaimeen. Alla olevissa esimerkeissä luodaan uusi PSObject ja tallennetaan kohteeseen joitakin tietoja. Tässä esimerkissä luodaan kaksi ”avainta” (Key1 ja Key2). Kumpikin näistä sisältää databittejä objektista (Value1 ja Value2).

Todellisessa elämässä avaimet ja arvot sisältävät kuvaustyyppistä tietoa objektista. Jos siis esimerkiksi tallentaisimme tietoa tiedostosta, joitain avain-arvopareja, joita voisimme luoda, olisivat Name, FileExtension, Path ja Size.

Tässä kerrotaan, miten luodaan PSObject sekä PowerShell 2.0 ja 3.0 ja uudemmissa:

PowerShell 2.0

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

PowerShell 3.0 & uudemmissa

PowerShell 3.0:ssa ja uudemmissa PowerShell 3.0:ssa PSObject:n luomiseen suositellaan seuraavaa koodia. Tämä johtuu siitä, että se säilyttää jokaisen luodun avainarvon järjestyksen, mikä tarkoittaa, että CSV-tiedostoon vietäessä lajittelujärjestys säilyy.

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

Monien PSObjektien tallentaminen matriisiin

Tähän mennessä olemme tarkastelleet yhden objektin (esim. tiedoston) tietojen tallentamista. Entä jos luettelemme kansiota ja tarvitsemme tietoa kaikista kansiossa olevista tiedostoista? Siinä tapauksessa luomme PSObject jokaiselle tiedostolle (tallentaaksemme sen yksittäiset tiedot) ja sitten tallentaisimme kaikki nämä PSObjektit arrayyn. Tämä tekee useiden objektien tietojen tallentamisesta ja viennistä todella helppoa.

Tässä kerrotaan, miten PSObjekti tallennetaan array:n sisälle. Jos haluat tehdä tämän useille tiedostoille, teet vain tämän ForEach-silmukan sisällä:

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

Reaalimaailman esimerkki

Asennetaanpa nopea esimerkki, joka auttaa esittelyssä. Tässä esimerkissä teemme seuraavaa:

Luetaan tekstitiedosto, jossa on luettelo työntekijöiden nimistä. Etsimme jokaisen nimen AD:stä ja keräämme joitakin lisätietoja, kuten käyttäjänimen ja sähköpostiosoitteen. Tämän jälkeen tulostamme nämä tiedot CSV-tiedostoon.

Esimerkkiratkaisu

Alhaalla oleva skripti luettelee kaikki tekstitiedostossa olevat työntekijän nimet ja hakee jokaisen osalta AD:stä heidän lisätietonsa työntekijästä. Kukin näistä tiedoista tallennetaan omaan PSOobjektiinsa nimeltä $hItemDetails.

Voidaksemme varmistaa, että tiedot ovat oikeassa järjestyksessä, kun ne viedään CSV-tiedostoon, käytämme @{}-menetelmää uuden PSObject luomiseen (käytettävissä vain PowerShell 3.0:ssa ja sitä uudemmissa versioissa). Lopuksi, koska työntekijöitä on useita, tallennan jokaisen PSObjectin $aResults-matriisiin. Tämä array viedään sitten CSV-muotoon.

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"

.

Vastaa

Sähköpostiosoitettasi ei julkaista.