Pisząc skrypty PowerShell, często szukam określonych danych, przechowuję te dane w obiekcie, a następnie najczęściej eksportuję je do formatu CSV. Ten artykuł pokazuje, jak zrobić to wszystko za pomocą PSObject
.
Najprostszym sposobem na przechowywanie danych dla obiektu jest przechowywanie ich za pomocą PSObject
. Jeśli masz wiele obiektów, dla których musisz przechowywać dane, możesz przechowywać każdy PSObject
w tablicy. Ta tablica może być następnie wyeksportowana do CSV.
A PSObject
jest bardzo podobny do tablicy hashtable, gdzie dane są przechowywane w parach klucz-wartość. Możesz utworzyć tyle par klucz-wartość, ile chcesz dla każdego PSObject
.
Tworzenie obiektu PSObject
Jak wspomniano, PowerShell PSObject
używa struktury typu para klucz & wartość. Aby przechowywać dane w PSObject
wystarczy zdefiniować klucz, a następnie przechowywać wartość w tym kluczu. Poniższy przykład tworzy nowy obiekt PSObject
i przechowuje w nim pewne dane. W tym przykładzie tworzymy dwa „klucze” (Key1 i Key2). Każdy z nich zawiera bity danych o obiekcie (Value1 i Value2).
W prawdziwym scenariuszu życia klucze i wartości zawierają informacje typu opisowego o obiekcie. Tak więc na przykład, jeśli przechowujemy informacje o pliku, niektóre z par klucz-wartość, które możemy utworzyć, to Name, FileExtension, Path i Size.
Oto jak utworzyć PSObject
zarówno w PowerShell 2.0 oraz 3.0 i wyżej:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 &powyżej
W PowerShell 3.0 i wyżej, zaleca się użycie następującego kodu do utworzenia PSObject
. Dzieje się tak, ponieważ zachowuje on kolejność każdej utworzonej wartości kluczowej, co oznacza, że podczas eksportu do CSV zachowana jest kolejność sortowania.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Przechowywanie wielu obiektów PSO w tablicy
Do tej pory przyglądaliśmy się przechowywaniu informacji o pojedynczym obiekcie (np. pliku). Co jeśli wyliczamy folder i potrzebujemy przechowywać informacje o wszystkich plikach w tym folderze? W takim przypadku, utworzylibyśmy PSObject
dla każdego pliku (aby przechowywać jego indywidualne dane), a następnie przechowywalibyśmy wszystkie te obiekty PSObjects w tablicy. To sprawia, że naprawdę łatwo jest przechowywać i eksportować informacje dla wielu obiektów.
Oto jak przechowujesz PSObject wewnątrz tablicy. Aby zrobić to dla wielu plików, po prostu wykonaj to wewnątrz pętli ForEach
:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Przykład z prawdziwego świata
Zestawmy szybki przykład, aby pomóc w demonstracji. W tym przykładzie wykonamy następujące czynności:
Przeczytanie pliku tekstowego z listą nazwisk pracowników. Dla każdego nazwiska sprawdzimy je w AD i zbierzemy kilka dodatkowych informacji, w tym nazwę użytkownika i adres e-mail. Następnie będziemy wypisywać te dane do CSV.
Przykładowe rozwiązanie
Poniższy skrypt wylicza wszystkie nazwiska pracowników w pliku tekstowym, a dla każdego z nich wyszukuje w AD ich dodatkowe informacje o pracowniku. Każda z tych danych jest przechowywana w swoim własnym obiekcie PSO o nazwie $hItemDetails
.
Aby zapewnić, że dane są w odpowiedniej kolejności, gdy są eksportowane do CSV, używamy metody @{}
tworzenia nowego PSObject
(dostępnej tylko w PowerShell 3.0 i nowszych wersjach). W końcu, ponieważ istnieje wielu pracowników, przechowuję każdy PSObject w tablicy o nazwie $aResults
. Ta tablica jest następnie eksportowana 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"