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"

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.