Cuando escribo scripts de PowerShell, a menudo busco datos específicos, almaceno esos datos en un objeto y luego la mayoría de las veces los exporto a formato CSV. Este artículo muestra cómo hacer todo esto usando PSObject
.
La forma más fácil que encuentro para almacenar los datos de un objeto es almacenarlos usando un PSObject
. Si tiene varios objetos para los que necesita almacenar datos, puede almacenar cada PSObject
en una matriz. Esta matriz se puede exportar a CSV.
Un PSObject
es muy parecido a un hashtable donde los datos se almacenan en pares clave-valor. Puede crear tantos pares clave-valor como desee para cada PSObject
.
Creación de un PSObject
Como se ha mencionado, el PSObject
de PowerShell utiliza una estructura de tipo par clave &valor. Para almacenar datos en el PSObject
todo lo que necesita hacer es definir una clave y luego almacenar un valor en la clave. El siguiente ejemplo crea un nuevo PSObject
y almacena algunos datos en el objeto. En este ejemplo estamos creando dos «claves» (Clave1 y Clave2). Cada una de ellas contiene bits de datos sobre el objeto (Valor1 y Valor2).
En un escenario de la vida real las claves y los valores contienen información de tipo descriptivo sobre el objeto. Así que, por ejemplo, si estuviéramos almacenando información sobre un archivo, algunos de los pares clave-valor que podríamos crear serían Nombre, FileExtension, Ruta y Tamaño.
Aquí está la forma de crear un PSObject
tanto en PowerShell 2.0 y 3.0 y superior:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & superior
En PowerShell 3.0 y superior, se recomienda utilizar el siguiente código para crear un PSObject
. Esto se debe a que mantiene el orden de cada valor clave creado, lo que significa que al exportar a CSV se mantiene el orden de clasificación.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Almacenamiento de múltiples PSObjects en un array
Hasta ahora hemos visto el almacenamiento de información sobre un solo objeto (por ejemplo, un archivo). Qué pasa si estamos enumerando una carpeta y necesitamos almacenar información sobre todos los archivos de la carpeta? En ese caso, crearíamos un PSObject
para cada archivo (para almacenar sus datos individuales) y luego almacenaríamos todos estos PSObjects en un array. Esto hace que sea realmente fácil almacenar y exportar información para múltiples objetos.
Aquí se muestra cómo se almacena un PSObject dentro de un array. Para hacer esto para múltiples archivos que acaba de hacer esto dentro de la ForEach
bucle:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Un ejemplo del mundo real
Vamos a configurar un ejemplo rápido para ayudar con la demostración. En este ejemplo vamos a hacer lo siguiente:
Lectura de un fichero de texto que tiene una lista de nombres de empleados. Para cada nombre vamos a buscarlos en AD y recoger alguna información adicional, incluyendo el nombre de usuario y la dirección de correo electrónico. A continuación, vamos a la salida de estos datos a CSV.
Solución de ejemplo
La secuencia de comandos a continuación enumera todos los nombres de los empleados en el archivo de texto, y para cada uno busca AD para su información adicional de los empleados. Cada uno de estos datos se almacena en su propio PSObject llamado $hItemDetails
.
Para asegurar que los datos están en el orden correcto cuando se exportan a CSV, utilizamos el método @{}
de crear un nuevo PSObject
(sólo disponible en PowerShell 3.0 y superior). Finalmente, como hay varios empleados, almaceno cada PSObject en un array llamado $aResults
. Este array se exporta a 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"