Sélection de données
L’exécution d’une commande peut être efficace. Vous pouvez ainsi obtenir des données à partir de votre ordinateur local ou sur le réseau. Pour améliorer votre efficacité, vous devez savoir comment obtenir les données de votre choix. La plupart des commandes fonctionnent sur des objets, en tant qu’entrée ou en sortie, ou les deux. Les objets ont des propriétés et vous pouvez souhaiter accéder à un sous-ensemble de ces propriétés et les présenter dans un rapport. Vous pouvez également trier vos données selon une ou plusieurs propriétés. Mais comment en arriver là ?
Utiliser Get-Member pour inspecter une sortie
Quand vous passez les résultats d’une commande à Get-Member, Get-Member retourne des informations sur un objet, notamment :
- Le type d’objet en train d’être transmis à Get-Member.
- Les propriétés de l’objet qui peuvent être évaluées.
- Les méthodes de l’objet qui peuvent être exécutées.
Nous allons illustrer cela en exécutant Get-Member sur la commande Get-Process .
Get-Process | Get-Member
Notez que vous utilisez le caractère | et qu’en appelant Get-Member, vous créez déjà un pipeline. Les premières lignes de la sortie de l’instruction précédente se présentent comme suit :
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize64
PM AliasProperty PM = PagedMemorySize64
SI AliasProperty SI = SessionId
VM AliasProperty VM = VirtualMemorySize64
WS AliasProperty WS = WorkingSet64
...
La sortie montre le type d’objet retourné par la commande Get-Process (System.Diagnostics.Process). Le reste de la réponse indique le nom, le type et la définition des membres de l’objet. Vous pouvez voir que si vous souhaitez faire tenir Get-Process avec une autre commande dans un pipeline, une bonne première étape consiste à le coupler avec Get-Member.
Select-Object
Par défaut, lorsque vous exécutez une commande qui va s’afficher en sortie à l’écran, PowerShell ajoute automatiquement la commande Out-Default. Quand les données de sortie sont une collection d’objets, PowerShell examine chaque type d’objet pour déterminer s’il existe une vue inscrite de ce type d’objet. S’il en trouve une, il utilise cette vue.
En général, la vue ne contient pas toutes les propriétés d’un objet, car elle ne s’affiche pas correctement à l’écran, donc seules certaines des propriétés les plus courantes sont incluses dans la vue.
Vous pouvez remplacer l’affichage par défaut en utilisant Select-Object et en choisissant votre propre liste de propriétés. Vous pouvez ensuite envoyer ces propriétés à Format-Table ou Format-List pour afficher la table à votre convenance.
Observez le résultat de l’exécution de Get-Process sur le processus zsh :
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 0.01 0.38 644 620 zsh
0 0.00 0.01 0.38 727 727 zsh
0 0.00 0.01 0.38 731 731 zsh
0 0.00 0.01 0.38 743 743 zsh
0 0.00 0.01 0.38 750 750 zsh
0 0.00 0.88 0.91 15747 …47 zsh
0 0.00 0.01 0.29 41983 …83 zsh
0 0.00 1.16 0.31 68298 …98 zsh
Vous voyez une vue qui représente ce que vous souhaitez probablement voir à partir de cette commande. Toutefois, cette vue n’affiche pas un ensemble complet d’informations. Pour un affichage différent, vous pouvez spécifier explicitement les propriétés que vous souhaitez voir dans le résultat.
Obtention de la réponse complète
Ce que vous avez vu jusqu’à présent est une réponse limitée. Pour présenter la réponse complète, utilisez un caractère générique *, comme suit :
Get-Process zsh | Format-List -Property *
Le caractère * vous indique chaque attribut et sa valeur, ce qui vous permet d’examiner les valeurs qui vous intéressent. La réponse complète utilise également les noms de présentation pour les propriétés à la place des noms de propriétés réels. Cela améliore la lisibilité d’un rapport.
Malgré ces avantages, vous ne souhaitez peut-être pas obtenir une sortie complète des données. Il est possible que la réponse par défaut ne vous convienne pas non plus.
Sélection de colonnes spécifiques
Pour limiter la réponse et trouver un juste milieu entre la réponse par défaut et la réponse complète, vous devez sélectionner certaines propriétés qui vous intéressent et faire de votre sélection une entrée de paramètre dans Select-Object. Mais, et voici un problème, vous devez utiliser les véritables noms des colonnes. Comment trouver ces véritables noms ? Utiliser Get-Member. Un appel à Get-Member vous donne toutes les propriétés et leurs noms réels.
Recherche d’un nom de propriété réel
Récapitulons rapidement la réponse par défaut, avec ce sous-ensemble :
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 0.01 0.38 644 620 zsh
À partir de la réponse par défaut, les propriétés Id et ProcessName sont probablement les mêmes, mais le ou les processeur(s) porte(nt) un nom de présentation, les noms de propriété réels tendent à être constitués uniquement de caractères de texte sans espace. Pour déterminer le nom réel d’une propriété spécifique, vous pouvez utiliser Get-Member :
Get-Process zsh | Get-Member -Name C*
Vous obtenez maintenant une liste de tous les membres dont le nom commence par un C. Parmi ces noms, c’est probablement CPU que vous souhaitez :
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
CancelErrorRead Method void CancelErrorRead()
CancelOutputRead Method void CancelOutputRead()
Close Method void Close()
CloseMainWindow Method bool CloseMainWindow()
Container Property System.ComponentModel.IContainer Container {get;}
CommandLine ScriptProperty System.Object CommandLine {get=…
Company ScriptProperty System.Object Company {get=$this.Mainmodule.FileVersionInfo.CompanyName;}
CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;}
Vous savez maintenant comment utiliser Select-Object pour demander exactement ce dont vous avez besoin avec les noms de propriété corrects, comme ceci :
Get-Process zsh | Select-Object -Property Id, Name, CPU
Voici :
Id Name CPU
-- ---- ---
644 zsh 0.3812141
727 zsh 0.3826498
731 zsh 0.3784953
743 zsh 0.3776352
750 zsh 0.3824036
15747 zsh 0.9097993
41983 zsh 0.2934763
68298 zsh 0.3121695
Cette séquence de commande vous donne une sortie qui diffère de la sortie par défaut, mais contient des propriétés qui vous intéressent.
Tri
Quand vous utilisez Sort-Object dans un pipeline, PowerShell trie les données de sortie en utilisant d’abord les propriétés par défaut. Si aucune propriété de ce type n’existe, il tente de comparer les objets eux-mêmes. Le tri est effectué par ordre croissant ou décroissant.
En fournissant des propriétés, vous pouvez choisir de trier par colonnes spécifiques, comme suit :
Get-Process | Sort-Object -Descending -Property Name
Dans la commande précédente, nous trions la colonne Name par ordre décroissant. Pour effectuer un tri sur plusieurs colonnes, séparez les noms de colonnes par une virgule, comme suit :
Get-Process | Sort-Object -Descending -Property Name, CPU
En plus de trier par nom de colonne, vous pouvez également fournir votre propre expression personnalisée. Dans cet exemple, nous utilisons une expression personnalisée pour trier les colonnes Name et CPU, ainsi que pour contrôler l’ordre de tri de chaque colonne.
Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}
L’exemple précédent montre la puissance et la flexibilité de Sort-Object. Ce sujet est un peu plus complexe et dépasse le cadre de ce module, mais il est traité plus en détail dans des modules plus avancés.