Windows PowerShell

Astuces de pipeline intéressantes : récapitulatif

Don Jones

 

Le mois dernier, je vous ai montré une bonne astuce de pipeline qui utilise la liaison de paramètres de pipeline pour transformer une tâche assez complexe en une seule ligne de code Windows PowerShell simple.

En voici un récapitulatif rapide : j'ai créé un fichier CSV (valeurs séparées par une virgule) contenant des informations sur les nouveaux utilisateurs dont j'avais besoin pour créer un domaine Active Directory. J'ai vérifié que les en-têtes de colonnes du fichier CSV correspondaient aux noms de paramètre de l'applet de commande New-ADUser (fournie avec Windows Server 2008 R2 et qui peut être utilisée également avec les domaines Windows Server 2003). Les en-têtes de colonnes étaient des éléments du type « Department », « City », « Name », « GivenName », « Surname », etc. Comme New-ADUser lie l'entrée de pipeline par nom de propriété, sélectionner ces noms de colonnes m'a permis de créer les utilisateurs simplement avec deux applets de commande :

Import-CSV c:\new-users.csv | New-ADUser

L'applet de commande Import-CSV génère en sortie un objet pour chaque ligne du fichier CSV. Les propriétés de ces objets correspondent aux noms de colonnes du fichier CSV. Comme mon fichier CSV contenait tous les paramètres nécessaires de New-ADUser, je n'ai pas eu à indiquer manuellement de paramètres, bien que j'eusse pu spécifier des paramètres qui ne se trouvaient pas dans le fichier et qui auraient été valables pour tous les nouveaux utilisateurs, comme une organisation :

Import-CSV c:\new-users.csv | New-ADUser –organization "OurCompany"

À mon avis, cet exemple démontre réellement la puissance de Windows PowerShell : avec VBScript, cette tâche aurait nécessité un script de plusieurs lignes (ce qui est également possible dans Windows PowerShell). Cependant, en prenant le temps de comprendre le fonctionnement du pipeline et avec l'aide de quelques applets de commande bien écrites, ce « script » se résumerait à quelques commandes simples.

Alors, quel est le problème ?

Quelques lecteurs perspicaces ont posé des questions sur mon site Web à l'adresse www.ConcentratedTech.com et m'ont fait remarquer que mon astuce fonctionnait uniquement si les noms de colonnes du fichier CSV correspondaient exactement aux noms de paramètre de New-ADUser. Si un administrateur crée le fichier CSV, vous pouvez certainement compter sur l'exactitude de la correspondance ; mais si le fichier arrive des Ressources humaines, les noms de colonnes ressembleront plus certainement à « First Name », « Last Name », etc., ce qui ne constitue pas la correspondance exacte nécessaire pour que New-ADUser lie automatiquement ces propriétés à ses paramètres.

Bien sûr, vous pourrez toujours modifier le fichier ou la base de données envoyé par les Ressources humaines, mais c'est bien pour ce type de corvée que les ordinateurs ont été inventés, non ? Windows PowerShell offre évidemment une solution rapide et simple pour « renommer » les propriétés : l'applet de commande Select-Object.

Select-Object est une de ces applets de commande dont l'apprentissage peut être délicat, car elle est réellement polyvalente. Par exemple, l'une de ses tâches principales est de simplifier les objets en éliminant les propriétés dont vous n'avez pas actuellement besoin. Indiquez simplement les propriétés dont vous avez besoin et l'applet de commande génère en sortie un objet réduit. Cela peut servir à rendre plus clairs l'affichage des résultats et les fichiers texte, par exemple :

Get-WmiObject Win32_OperatingSystem | Select-Object BuildNumber,ServicePackMajorVersion

Select-Object permet également de sélectionner un sous-ensemble d'objets du pipeline en utilisant les paramètres –first ou –last :

Get-Process | Sort VM –desc | Select –first 10

Notez que j'ai utilisé l'alias Select à la place du nom complet de l'applet de commande.

Voici la solution

Une autre fonction, souvent ignorée, de Select-Object est sa capacité à non seulement sélectionner les propriétés dont vous avez besoin, mais également à les renommer. Si vous avez déjà lu l'intégralité de l'aide de l'applet de commande (Help Select –full, ce que je vous recommande de faire avec toutes les applets de commande), vous connaissez cette capacité et vous en avez même déjà vu des exemples d'utilisation. Voici un exemple :

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}

Si le fichier CSV d'entrée contient une colonne « Last Name », elle sera renommée en « Surname », ce qui permet à la propriété de sortie de correspondre au nom de paramètre de New-ADUser. J'ai créé une table de hachage, également appelée dictionnaire ou tableau associatif. Le signe @ est un opérateur de tableau dans Windows PowerShell et la table de hachage est un tableau constitué de paires clé/valeur. Dans notre exemple, la clé est le nom de la propriété que je veux créer et la valeur est le contenu que je veux attribuer à cette propriété. Dans la partie expression de la table de hachage, je peux utiliser la variable $_ pour faire référence à l'objet pipeline actif. Dans notre exemple, j'ai extrait sa propriété « Last Name » (j'ai dû entourer le nom de la propriété de guillemets, car il contient un espace).

Vous pouvez en soumettre autant que vous voulez à Select-Object :

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}}

Comme Select-Objectgénère en sortie strictement ce que vous lui demandez de sortir, vous ne pouvez pas simplement lui demander de renommer une ou deux colonnes et vous attendre à ce qu'il génère ces deux colonnes plus tout ce que vous ne souhaitez pas renommer. En règle générale, vous devez indiquer toutes les propriétés que vous voulez obtenir en sortie sur la prochaine applet de commande. Bien sûr, si vous ne devez pas renommer toutes les colonnes de votre fichier CSV, vous pouvez simplement les répertorier comme suit :

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}},Department,Organization,Name

Dans ce cas, « Department », « Organization » et « Name » seront passés sans être renommés, ce qui est correct, car ils correspondent exactement aux paramètres associés de New-ADUser.

Comme cette opération peut paraître fastidieuse si vous devez indiquer un grand nombre de colonnes, voici un raccourci :

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}},*

L'astérisque « * » génère en sortie toutes les propriétés de l'objet d'entrée, en plus des propriétés « Surname » et « GivenName » que j'ai créées. Imaginons un fichier CSV semblable à ce qui suit :

First Name,Last Name,Department,Name
Don,Jones,IT,DonJ
Greg,Shields,Janitorial,GregS
Jeff,Hicks,IT,JeffH

Je peux utiliser ces deux applets de commande :

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}},*

et mes objets en sortie auront chacun six propriétés : « First Name », « Last Name », « Department », « Name », « Surname » et « GivenName ». Autrement dit, toutes les propriétés d'origine, plus celles que j'ai ajoutées. Je n'ai plus qu'à ajouter l'applet de commande New-ADUser :

Import-CSV c:\new-users.csv | Select @{Name="Surname";Expression={$_."Last Name"}}, @{Name="GivenName";Expression={$_."First Name"}},* | New-ADUser

L'applet de commande New-ADUser ne fera rien avec les propriétés « First Name » et « Last Name », car elles ne correspondent à aucun de ces paramètres. Cela ne pose aucun problème, car l'applet de commande va simplement ignorer les propriétés qu'elle ne peut pas lier. Elle va cependant lier les quatre autres propriétés (« Surname », « GivenName », « Department » et « Name », dans le cas présent) et créer les nouveaux comptes d'utilisateurs pour moi.

Une autre façon de voir les choses

L'un des plus grands défis de Windows PowerShell est qu'il ne faut jamais abandonner. Autrement dit, si vous ne pouvez pas utiliser un fichier CSV parce que les noms de colonnes ne correspondent pas à vos besoins, ne partez pas du principe qu'il faut modifier le fichier CSV ! Windows PowerShell peut presque toujours faire ce dont vous avez besoin, après quelques recherches de votre côté.

Alors, quels défis impossibles avez-vous dû relever avec Windows PowerShell ? J'aimerais bien le savoir, et peut-être apporter ma réponse dans un prochain article ! Posez vos questions à l'adresse www.ConcentratedTech.com. J'y répondrai immédiatement en ligne, je vous demanderai plus de détails et j'en ferai peut-être un article pour Microsoft TechNet Magazine.

Don Jones est l'un des formateurs et des rédacteurs Windows PowerShell les plus expérimentés du pays. Il rédige toutes les semaines des astuces sur Windows PowerShell sur le blog à l'adresse ConcentratedTech.com, blog sur lequel vous pouvez également le contacter ou lui poser des questions.

Contenu associé