Quando scrivo script PowerShell, spesso cerco dei dati specifici, memorizzo quei dati in un oggetto e poi la maggior parte delle volte li esporto in formato CSV. Questo articolo ti mostra come fare tutto questo usando PSObject
.
Il modo più semplice che trovo per memorizzare i dati di un oggetto è quello di memorizzarli usando un PSObject
. Se avete più oggetti per i quali avete bisogno di memorizzare i dati, allora potete memorizzare ogni PSObject
in un array. Questo array può poi essere esportato in CSV.
Un PSObject
è molto simile a un hashtable dove i dati sono memorizzati in coppie chiave-valore. Puoi creare tutte le coppie chiave-valore che vuoi per ogni PSObject
.
Creazione di un PSObject
Come menzionato, il PowerShell PSObject
usa una struttura di coppia chiave & valore. Per memorizzare dati nel PSObject
tutto quello che devi fare è definire una chiave e poi memorizzare un valore nella chiave. L’esempio qui sotto crea un nuovo PSObject
e memorizza alcuni dati nell’oggetto. In questo esempio stiamo creando due “chiavi” (Key1 e Key2). Ognuna di queste contiene bit di dati sull’oggetto (Value1 e Value2).
In uno scenario di vita reale le chiavi e i valori contengono informazioni di tipo descrittivo sull’oggetto. Così, per esempio, se stiamo memorizzando informazioni su un file, alcune delle coppie chiave-valore che potremmo creare sarebbero Name, FileExtension, Path e Size.
Ecco come creare un PSObject
sia in PowerShell 2..0 e 3.0 e superiori:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & superiore
In PowerShell 3.0 e superiori, si raccomanda di utilizzare il seguente codice per creare un PSObject
. Questo perché mantiene l’ordine di ogni valore chiave creato, il che significa che quando si esporta in CSV l’ordine viene mantenuto.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Memorizzazione di più PSObjects in un array
Finora abbiamo guardato alla memorizzazione di informazioni su un singolo oggetto (per esempio un file). Cosa succede se stiamo enumerando una cartella e abbiamo bisogno di memorizzare informazioni su tutti i file nella cartella? In questo caso, creeremmo un PSObject
per ogni file (per memorizzare i suoi dati individuali) e poi memorizzeremmo tutti questi PSObjects in un array. Questo rende molto facile memorizzare ed esportare informazioni per più oggetti.
Ecco come si memorizza un PSObject in un array. Per fare questo per file multipli devi solo fare questo all’interno del ciclo ForEach
:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Un esempio del mondo reale
Impostiamo un esempio veloce per aiutare la dimostrazione. In questo esempio faremo quanto segue:
Lettura di un file di testo che ha una lista di nomi di impiegati. Per ogni nome li cercheremo in AD e raccoglieremo alcune informazioni aggiuntive, compresi nome utente e indirizzo e-mail. Poi emetteremo questi dati in CSV.
Soluzione d’esempio
Lo script sottostante enumera tutti i nomi dei dipendenti nel file di testo, e per ognuno cerca in AD le informazioni aggiuntive sui dipendenti. Ognuno di questi dati è memorizzato nel proprio PSObject chiamato $hItemDetails
.
Per assicurarci che i dati siano nell’ordine corretto quando vengono esportati in CSV, usiamo il metodo @{}
di creare un nuovo PSObject
(disponibile solo in PowerShell 3.0 e superiore). Infine, poiché ci sono più dipendenti, memorizzo ogni PSObject in un array chiamato $aResults
. Questo array viene poi esportato in 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"