Při psaní skriptů PowerShell často vyhledávám konkrétní data, ukládám je do objektu a pak je většinou exportuji do formátu CSV. Tento článek vám ukáže, jak toto vše provést pomocí PSObject
.
Nejjednodušší způsob, jak uložit data pro objekt, mi přijde uložit je pomocí PSObject
. Pokud máte více objektů, pro které potřebujete uložit data, pak můžete každý PSObject
uložit do pole. Toto pole pak můžete exportovat do CSV.
Příkaz PSObject
se velmi podobá hashtable, kde jsou data uložena v párech klíč-hodnota. Pro každý PSObject
můžete vytvořit libovolný počet dvojic klíč-hodnota.
Vytvoření PSObject
Jak již bylo zmíněno, PowerShell PSObject
používá strukturu typu dvojice klíč &hodnota. Pro uložení dat do PSObject
stačí definovat klíč a poté do klíče uložit hodnotu. Níže uvedené příklady vytvoří nový objekt PSObject
a uloží do něj některá data. V tomto příkladu vytváříme dva „klíče“ (Key1 a Key2). Každý z nich obsahuje bity dat o objektu (Hodnota1 a Hodnota2).
V reálném scénáři klíče a hodnoty obsahují informace typu popisu o objektu. Pokud bychom tedy například ukládali informace o souboru, některé z dvojic klíč-hodnota, které bychom mohli vytvořit, by byly Name (název), FileExtension (přípona souboru), Path (cesta) a Size (velikost).
Tady je návod, jak vytvořit PSObject
jak v prostředí PowerShell 2, tak v prostředí PowerShell.0 i 3.0 a vyšší:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & vyšší
V prostředí PowerShell 3.0 a vyšším se pro vytvoření PSObject
doporučuje použít následující kód. Ten totiž zachovává pořadí jednotlivých vytvořených klíčových hodnot, což znamená, že při exportu do CSV bude zachováno pořadí řazení.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Uložení více PSObjektů v poli
Dosud jsme se zabývali ukládáním informací o jednom objektu (např. souboru). Co když vyjmenováváme složku a potřebujeme uložit informace o všech souborech ve složce? V takovém případě bychom vytvořili PSObject
pro každý soubor (pro uložení jeho individuálních údajů) a pak bychom všechny tyto PSObjekty uložili do pole. Takto lze opravdu snadno ukládat a exportovat informace pro více objektů.
Tady je návod, jak uložit PSObject uvnitř pole. Chcete-li to provést pro více souborů, stačí provést tento postup uvnitř smyčky ForEach
:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Reálný příklad
Nastavíme si rychlý příklad, který nám pomůže s demonstrací. V tomto příkladu budeme provádět následující:
Čtení textového souboru, který obsahuje seznam jmen zaměstnanců. Pro každé jméno je vyhledáme v systému AD a shromáždíme některé další informace, včetně uživatelského jména a e-mailové adresy. Tyto údaje pak budeme vypisovat do formátu CSV.
Příklad řešení
Následující skript vyjmenuje všechna jména zaměstnanců v textovém souboru a pro každé z nich vyhledá v systému AD jejich další informace. Každý z těchto údajů je uložen ve vlastním objektu PSObject s názvem $hItemDetails
.
Abychom zajistili správné pořadí údajů při exportu do CSV, použijeme metodu @{}
vytvoření nového objektu PSObject
(dostupná pouze v prostředí PowerShell 3.0 a vyšším). Nakonec, protože existuje více zaměstnanců, uložím každý PSObject do pole nazvaného $aResults
. Toto pole je pak exportováno do 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"