Aller au contenu principal

Rencontre 2 - Objets et pipeline

Résumé de la séance
  1. Rappel du cours précédent
  2. Correction des exercices
  3. Exemples de commandes utiles
  4. Objets
  5. Pipeline
  6. Variables

PowerShell est un langage orienté objet reposant sur le cadre logiciel .NET Framework. De ce fait, chaque commande (cmdlet) retourne un ou plusieurs objets. Cette particularité diffère des commandes externes et des autres langages de shell, qui retournent du texte

Les objets sont beaucoup plus facile à interpréter par des algorithmes, car on peut extraire l'information qu'on souhaite sans procéder à des manipulations de chaînes de caractères. Ils nous donnent l'opportunité de les manipuler à notre guise, en les passant d'une commande à l'autre dans ce qu'on appelle le pipeline. Or, les humains ont plus de facilité à lire du texte que des objets. Donc à la fin de la chaîne de commandes, l'objet résultant est automatiquement converti en texte afin d'être lu par l'utilisateur.

Cette séance de cours porte principalement sur l'utilisation des objets qui résultent des différentes commandes PowerShell ainsi que le chaînage de plusieurs commandes dans le pipeline.

Objets

Les commandes PowerShell retournent un ou plusieurs objets. Un objet est une structure de données, un élément logique d'information d'une structure définie par une classe (ou type). Il est composé de plusieurs membres, soit des propriétés (ou méthodes), qui représentent de l'information décrivant l'objet, et des méthodes (ou fonctions) qui posent une action sur cet objet.

Connaître les membres d'un objet

La commande Get-Member permet d'obtenir la liste des propriétés et des méthodes offertes par cet objet. Dans le cas d'une collection d'objets, elle analyse le type d'objet dans la collection.

image

On peut spécifier le type de membre pour une recherche plus ciblée.

image

Obtenir une propriété

Par exemple, la commande Get-Item retourne l'information sur un fichier ou un dossier. Le résultat de cette commande est un objet qui décrit le fichier ou le dossier correspondant.

image

Si l'objet représente un fichier, il possèdera une propriété .Length qui représente sa taille, en octets. Pour accéder à un membre d'un objet, on utilise le caractère point. Il y a plusieurs manières d'identifier l'objet, soit avec des parenthèses, soit en le passant dans une variable.

image

Explorer les propriétés d'un objet

Pour explorer un objet, il est également utile de demander à lister toutes ses propriétés.

image

Il est ainsi plus facile de trouver des propriétés intéressantes.

Appeler une méthode

L'appel d'une méthode se fait de la même manière que pour une propriété, sauf que la méthode peut accepter des paramètres. Comme une méthode n'est pas une commande PowerShell, les paramètres n'obéissent pas aux même règles: ils ne sont pas nommés, et doivent être spécifiés en parenthèses.

image

Si la méthode qu'on appelle n'a pas de paramètre, il faut écrire les parenthèses quand même.

image

Connaître le type d'un objet

Une manière de connaître le type d'un objet est d'appeler sa méthode GetType(). Cette méthode existe dans tous les types d'objets, et retourne un objet qui décrit le type de cet objet.

image

Par exemple, la commande Get-Item peut retourner des fichiers et des dossiers, qui sont des structures très différentes. Selon l'élément que l'on tente d'obtenir, le type de l'objet résultant sera différent.

image

Si la commande retourne plusieurs objets, alors le type de l'objet retourné sera un array, c'est-à-dire un objet qui contient plusieurs objets. On les identifie avec des crochets [ ] à la fin de leur type.

image

Le pipeline

Le pipeline est le mécanisme par lequel l'information circule dans une session PowerShell. Il permet de chaîner des commandes afin que l'objet sortant d'une commande entre dans la prochaine pour y être traité. Le caractère pour chaîner les commande est la barre verticale | (appelée "pipe" ou "tube").

Pour mieux conceptualiser le pipeline, on peut voir chaque commande comme une machine qui prend un ou plusieurs objets en entrée (input), effectue un traitement en tenant compte de ces intrants (qui peuvent impliquer des appels au système d'exploitation), puis produit un objet en sortie (output) et le jette dans le pipeline.

image

Une commande produisant un objet en sortie (ou un objet déposé directement dans le pipeline) sera donc passé en entrée à la commande suivante, qui le passera dans un de ses paramètres, le traitera et produira un autre objet de type différent, qui pourra être passé à la prochaine commande, et ainsi de suite.

image

À la fin du pipeline, l'objet qui s'y trouve "tombe" dans la console (le host), où il sera automatiquement converti en texte selon plusieurs règles régies à la fois par la configuration de PowerShell et par la nature de cet objet.

image

On peut éviter à l'objet de tomber dans la console en le "pipant" dans une autre commande (habituellement, avec le verbe Out-), ou bien en l'affectant à une variable.

image

Si on souhaite se débarrasser de l'objet résultant, il suffit de terminer la chaîne de pipeline par la commande Out-Null, qui désigne simplement une sortie vers rien du tout.

image

Sélection

Plusieurs commandes, et particulièrement celles dont le verbe est Get, produisent des objets en sortie dans le pipeline, qui possèdent des propriétés. Certains objets en possèdent un grand nombre, et lorsqu'ils sont affichés sous forme de texte dans la console, parfois seules les propriétés principales sont affichées. Une opération simple consiste à "extraire" de cet objet certaines propriétés. Cette opération se nomme la "sélection" et peut être réalisée avec la commande Select-Object.

La sélection ne "transforme" pas vraiment l'objet, elle en produit plutôt une copie transformée.

On peut créer des objets composés de certaines propriétés en spécifiant le paramètre -Property de la commande Select-Object.

Par exemple, la commande suivante permet de "transformer" l'objet représentant le service "winmgmt" en objet composé uniquement de ses propriétés Nameet Status.

Get-Service -Name "winmgmt" | Select-Object -Property "Name", "Status"

On remarque qu'à l'exécution de cette commande, il reste des entêtes de colonnes. Alternativement, on peut extraire seulement la valeur de la propriété en spécifiant le paramètre -ExpandProperty.

Get-Service -Name "winmgmt" | Select-Object -ExpandProperty "Status"

image

Commandes de formatage

Lorsqu'un objet arrive au bout du pipeline, il est automatiquement converti en texte par PowerShell afin d'être affiché dans la console dans un format lisible par l'utilisateur. Comme un objet possède des données brutes, PowerShell doit faire un choix dans sa manière de représenter textuellement l'objet à l'écran. Le formatage se fait en fonction de plusieurs facteurs, dont la nature de la commande, le nombre de propriétés de l'objet, etc. On peut utiliser des commandes de formatage (typiquement, des commandes débutant par le verbe Format-.)

CommandeAliasDescription
Format-ListflConvertit l'objet en texte sous forme de liste
Format-TableftConvertit l’objet en texte sous forme de tableau (moins détaillé)
Format-WidefwConvertit l’objet en texte réparti sur la largeur (très sommaire)
Format-HexfhxConvertit des données en texte montrant leur valeur hexadécimale

On peut également effectuer des sélections à l'intérieur même de la commande de formatage.

image

C'est pratique pour explorer toutes les propriétés d'un objet. On peut le formater sous forme de liste et forcer l'affichage de toutes ses propriétés avec le symbole *.

image

Une fois un objet passé dans la commande de formatage, il est automatiquement converti en texte. C'est pourquoi le formatage est généralement utilisé à la toute fin du pipeline, ou avant une commande de sortie (Out-).

Commandes de sortie

Par défaut, lorsqu'un objet arrive au bout du pipeline, il est affiché dans la console (host) après avoir été converti en texte. On peut rediriger l'objet vers une autre sortie, comme un fichier ou une imprimante. Voici quelques commandes de sortie disponibles:

CommandeAliasDescription
Out-DefaultEnvoie l’objet vers la sortie par défaut (implicite, par défaut Out-Host)
Out-HostohEnvoie l’objet vers la console (il sera converti automatiquement en texte)
Out-FileEnvoie l’objet vers un fichier (il sera converti automatiquement en texte)
Out-NullEnvoie l’objet vers le néant (l’objet sera détruit)
Out-StringossConvertit les objets en chaîne de caractères
Out-PrinterlpEnvoie l’objet vers une imprimante
Out-GridViewogvSort l’objet vers une grille graphique (dans une fenêtre séparée)

Paramètre PassThru

Ce ne sont pas toutes les commandes qui produisent un objet sur le pipeline. Certaines commandes n'en produisent pas, soit parce qu'elles n'ont pas à le faire, soit parce que la plupart du temps, on n'a pas besoin de cet objet.

Par exemple, la commande Start-Process sert à démarrer un processus (un exécutable). Par défaut, lorsqu'on lance cette commande, elle se contente de demander à Windows de créer un processus et ne retourne rien.

image

Mais il peut arriver qu'on souhaite enregistrer des informations sur le processus nouvellement créé. Certaines commandes offrent un paramètre -PassThru, qui permettent de forcer la production d'un objet décrivant le résultat de la commande. Dans ce cas, la commande Start-Process produit un objet décrivant le processus.

image

Commande Tee-Object

La commande Tee-Object sert à enregistrer un objet dans une variable ou un fichier, en le relayant en même temps sur le pipeline.

image

Les variables

Les variables en PowerShell sont identifiées avec le préfixe $. Par exemple, la variable Foo s'écrit $Foo dans le code PowerShell. Le nom de la variable est Foo, et le caractère $ indique à PowerShell qu'il s'agit d'une variable.

Une variable contient un objet. L'opération consistant à mettre un objet dans une variable se nomme une affectation, et on la réalise à l'aide de l'opérateur d'affectation, =. Cet opérateur récupère l'objet résultant à la fin du pipeline afin de le stocker dans la variable, plutôt que de le laisser tomber dans la console.

Pour obtenir le contenu d'une variable, on utilise simplement son nom avec le caractère $. Cela a pour effet d'envoyer son contenu dans le pipeline. On peut aussi utiliser cette variable pour passer un objet dans un paramètre.

image

Une variable contient un objet, donc on peut l'utiliser pour accéder à toutes les méthodes et tous les attributs offerts par cet objet.

image

On peut connaître la liste de toutes les variables déclarées avec la commande Get-Variable.

image

Variables prédéfinies

Certaines variables sont prédéfinies par PowerShell.

VariableDescription
$trueReprésente la valeur booléenne vraie
$falseReprésente la valeur booléenne fausse
$nullReprésente la valeur nulle
$PIDLe numéro d'identification du processus courant
$PWDReprésente le répertoire courant
$argsContient un tableau des arguments passés à l'appel d'une fonction ou d'un script
$errorListe des erreurs lors de la session
$PSVersionTableTableau des versions de PowerShell
$HostObjet qui permet de modifier l'interface PowerShell
$HomeLe chemin du répertoire de l'utilisateur (typiquement C:\Users\nomdutilisateur)
$PSHomeLe chemin dans lequel PowerShell est installé
$PSCultureLa culture de la session PowerShell (fr-CA, en-US, etc.)
$_ ou $PSItemValeur courante dans le pipeline
...

Variables d'environnement

Le système d'exploitation offre à tous les processus un ensemble de variables gérées par le système et qui procurent de l'information sur l'environnement d'exécution.

Voici quelques variables d'environnement (mais il y en a plusieurs autres).

Variable (PoSH)Description
$env:COMPUTERNAMELe nom d'hôte de l'ordinateur
$env:USERNAMELe nom de l'utilisateur
$env:USERDOMAINLe nom du domaine de l'utilisateur courant (format NetBIOS)
$env:USERDNSDOMAINLe nom du domaine de l'utilisateur courant (format FQDN)
$env:LOGONSERVERLe nom du contrôleur de domaine ayant authentifié l'utilisateur lors de son logon
$env:UserProfileLe chemin vers le profil de l'utilisateur (typiquement C:\Users\nomdutilisateur)
$env:APPDATAChemin vers le répertoire AppData/Roaming de l'utilisateur courant
$env:LocalAppDataChemin vers le répertoire AppData/Local de l'utilisateur courant
$env:HOMEDRIVELe lecteur sur lequel est situé le profil de l'utilisateur
$env:HOMEPATHLe chemin relatif du profil utilisateur sur le lecteur HOMEDRIVE
$env:TEMPLe chemin vers le répertoire temporaire de l'utilisateur (même que TMP)
$env:TMPLe chemin vers le répertoire temporaire de l'utilisateur (même que TEMP)
$env:ALLUSERSPROFILELe chemin vers le profil utilisateur commun à tous les utilisateurs (programdata)
$env:ProgramDataLe chemin du répertoire qui contiennent les configurations du système
$env:ProgramFilesLe chemin vers le répertoire contenant les fichiers de programme
$env:{ProgramFiles (x86)}Le chemin vers le répertoire des fichiers de programme 32-bits (WoW64)
$env:PathLa liste des chemins qui contiennent des commandes exécutables
$env:PATHEXTLa liste des extensions à considérer comme exécutables
$env:PUBLICLe chemin vers le répertoire public (partagé par tous les profils)
$env:NUMBER_OF_PROCESSORSLe nombre de processeurs logiques installés dans le système
$env:PROCESSOR_ARCHITECTUREL'architecture du processeur (x86, amd64, ia64, arm64, etc.)
$env:ComSpecLe chemin vers l'interpréteur de commande par défaut
$env:OneDriveLe chemin vers le répertoire de synchronisation de OneDrive
$env:OneDriveCommercialLe chemin vers le répertoire de synchronisation de OneDrive For Business
$env:SystemDriveLe lecteur sur lequel Windows est installé (typiquement C:)
$env:SystemRootLe chemin vers le répertoire où Windows est installé (typiquement C:\Windows)
$env:PSModulePathLa liste des chemins qui contiennent des modules PowerShell

Dans l'interpréteur de commande classique (cmd), et à plusieurs autres endroits du système (comme dans le shell graphique, le registre, etc.), les variables d'environnement sont accessibles en les entourant de deux symboles %.

image

image

La commande Set permet d'obtenir la liste des variables d'environnement.

image

Sous PowerShell, la syntaxe est différente. On utilise le préfixe $env: pour y accéder.

image

Pour obtenir la liste, on fait un Get-ChildItem sur le lecteur env:, qui contient toutes les variables d'environnement du processus.

image

attention

Les variables d'environnement sont rattachées à un processus particulier, et chaque processus créé hérite des variables d'environnement du processus parent. Ainsi, si on fait des modification à une variable d'environnement, celle-ci ne sera modifiée que dans ce processus et pas les autres. De plus, le changement sera détruit après la fin du processus, lorsque la fenêtre PowerShell est fermée. Il est possible de modifier une variable d'environnement de manière permanente, mais nous verrons cela dans une séance ultérieure.

Transcription

Il est possible de demander à PowerShell d'enregistrer automatiquement dans un fichier tout ce qui se fait dans la fenêtre. C'est pratique pour garder des traces de ce qu'on fait. La commande pour tirer profit de cette fonctionnalité est Start-Transcript. On fournit à la commande le chemin vers un fichier, et tout ce qui est écrit et affiché dans la console y est sauvegardé. Pour terminer l'enregistrement, il suffit de lancer Stop-Transcript, ou simplement de mettre fin à la session PowerShell.

image

image