Lorsque j’écris des scripts PowerShell, je recherche souvent des données spécifiques, je stocke ces données dans un objet et ensuite, la plupart du temps, je les exporte au format CSV. Cet article vous montre comment faire tout cela en utilisant PSObject
.
La façon la plus simple que je trouve pour stocker des données pour un objet est de les stocker en utilisant un PSObject
. Si vous avez plusieurs objets pour lesquels vous devez stocker des données, vous pouvez alors stocker chaque PSObject
dans un tableau. Ce tableau peut ensuite être exporté en CSV.
Un PSObject
ressemble beaucoup à une table de hachage où les données sont stockées dans des paires clé-valeur. Vous pouvez créer autant de paires clé-valeur que vous le souhaitez pour chaque PSObject
.
Création d’un PSObject
Comme mentionné, le PSObject
PowerShell utilise une structure de type paire clé &valeur. Pour stocker des données dans le PSObject
, il suffit de définir une clé, puis de stocker une valeur dans la clé. Les exemples ci-dessous créent un nouveau PSObject
et stockent quelques données dans l’objet. Dans cet exemple, nous créons deux « clés » (Key1 et Key2). Chacune d’entre elles contient des bits de données sur l’objet (Value1 et Value2).
Dans un scénario de la vie réelle, les clés et les valeurs contiennent des informations de type description sur l’objet. Ainsi, par exemple, si nous stockions des informations sur un fichier, certaines des paires clé-valeur que nous pourrions créer seraient Name, FileExtension, Path et Size.
Voici comment créer un PSObject
dans les deux PowerShell 2.0 et 3.0 et supérieur:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & supérieur
Dans PowerShell 3.0 et supérieur, il est recommandé d’utiliser le code suivant pour créer un PSObject
. En effet, il maintient l’ordre de chaque valeur de clé créée, ce qui signifie que lors de l’exportation vers CSV, l’ordre de tri est maintenu.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Stockage de plusieurs PSObjects dans un tableau
Jusqu’à présent, nous avons examiné le stockage d’informations sur un seul objet (par exemple, un fichier). Que faire si nous énumérons un dossier et que nous avons besoin de stocker des informations sur tous les fichiers du dossier ? Dans ce cas, nous créerions un PSObject
pour chaque fichier (pour stocker ses données individuelles) et nous stockerions ensuite tous ces PSObjects dans un tableau. Cela rend vraiment facile le stockage et l’exportation d’informations pour plusieurs objets.
Voici comment vous stockez un PSObject à l’intérieur d’un tableau. Pour faire cela pour plusieurs fichiers, vous devriez juste faire ceci à l’intérieur de la boucle ForEach
:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
Un exemple du monde réel
Paramétons un exemple rapide pour aider à la démonstration. Dans cet exemple, nous allons faire ce qui suit:
Lire un fichier texte qui contient une liste de noms d’employés. Pour chaque nom, nous allons les rechercher dans AD et recueillir quelques informations supplémentaires, y compris le nom d’utilisateur et l’adresse e-mail. Nous allons ensuite sortir ces données au format CSV.
Exemple de solution
Le script ci-dessous énumère tous les noms d’employés dans le fichier texte, et pour chacun d’eux recherche dans AD leurs informations supplémentaires sur les employés. Chacune de ces données est stockée dans son propre PSObject appelé $hItemDetails
.
Pour s’assurer que les données sont dans le bon ordre lorsqu’elles sont exportées vers le CSV, nous utilisons la méthode @{}
de création d’un nouveau PSObject
(uniquement disponible dans PowerShell 3.0 et plus). Enfin, comme il y a plusieurs employés, je stocke chaque PSObject dans un tableau appelé $aResults
. Ce tableau est ensuite exporté en 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"