about_Calculated_Properties

Description courte

PowerShell permet d’ajouter dynamiquement de nouvelles propriétés et de modifier la mise en forme des objets en sortie dans le pipeline.

Description longue

Plusieurs applets de commande PowerShell transforment, regroupent ou traitent des objets d’entrée en objets de sortie à l’aide de paramètres qui permettent l’ajout de nouvelles propriétés à ces objets de sortie. Vous pouvez utiliser ces paramètres pour générer de nouvelles propriétés calculées sur des objets de sortie en fonction des valeurs des objets d’entrée. La propriété calculée est définie par une table de hachage contenant des paires clé-valeur qui spécifient le nom de la nouvelle propriété, une expression pour calculer la valeur et des informations de mise en forme facultatives.

Applets de commande prises en charge

Les applets de commande suivantes prennent en charge les valeurs de propriété calculées pour le paramètre Property . Les Format-* applets de commande prennent également en charge les valeurs calculées pour le paramètre GroupBy .

La liste suivante répertorie les applets de commande qui prennent en charge les propriétés calculées et les paires clé-valeur prises en charge par chaque applet de commande.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label - facultatif (ajouté dans PowerShell 6.x)
    • expression
    • width -optionnel
    • alignment -optionnel
  • Format-Custom

    • expression
    • depth -optionnel
  • Format-List

    • name/label -optionnel
    • expression
    • formatstring -optionnel

    Ce même ensemble de paires clé-valeur s’applique également aux valeurs de propriété calculées passées au paramètre GroupBy pour toutes les Format-* applets de commande.

  • Format-Table

    • name/label -optionnel
    • expression
    • formatstring -optionnel
    • width -optionnel
    • alignment -optionnel
  • Format-Wide

    • expression
    • formatstring -optionnel
  • Group-Object

    • expression
  • Measure-Object

    • Prend uniquement en charge un bloc de script pour l’expression, et non une table de hachage.
    • Non pris en charge dans PowerShell 5.1 et versions antérieures.
  • Select-Object

    • name/label -optionnel
    • expression
  • Sort-Object

    • expression
    • ascending/descending -optionnel

Remarque

La valeur du bloc peut être un bloc de expression script au lieu d’une table de hachage. Pour plus d’informations, consultez la section Remarques.

Définitions de clés de table de hachage

  • name/label - Spécifie le nom de la propriété en cours de création. Vous pouvez utiliser name ou son alias, labelde façon interchangeable.
  • expression - Bloc de chaîne ou de script utilisé pour calculer la valeur de la nouvelle propriété. Si la expression valeur est une chaîne, la valeur est interprétée comme un nom de propriété sur l’objet d’entrée. Il s’agit d’une option plus courte que expression = { $_.<PropertyName> }.
  • alignment - Utilisé par les applets de commande qui produisent une sortie tabulaire pour définir la façon dont les valeurs sont affichées dans une colonne. La valeur doit être 'left', 'center' ou 'right'.
  • formatstring - Spécifie une chaîne de format qui définit la façon dont la valeur est mise en forme pour la sortie. Pour plus d’informations sur les chaînes de format, consultez Types de format dans .NET.
  • width - Spécifie la colonne de largeur maximale dans une table lorsque la valeur est affichée. La valeur doit être supérieure à 0.
  • depth - Paramètre De profondeur de Format-Custom spécifie la profondeur d’expansion pour toutes les propriétés. La depth clé vous permet de spécifier la profondeur d’expansion par propriété.
  • ascending / descending : vous permet de spécifier l’ordre de tri pour une ou plusieurs propriétés. Il s’agit de valeurs booléennes.

Vous n’avez pas besoin d’expliquer les clés de table de hachage tant que le préfixe de nom spécifié n’est pas ambigu. Par exemple, vous pouvez utiliser n au lieu de Name et e non pas .Expression

Exemples

Compare-Object

Avec les propriétés calculées, vous pouvez contrôler la façon dont les propriétés des objets d’entrée sont comparées. Dans cet exemple, au lieu de comparer les valeurs directement, les valeurs sont comparées au résultat de l’opération arithmétique (module de 2).

Compare-Object @{p=1} @{p=2} -property @{ Expression = { $_.p % 2 } }
 $_.p % 2  SideIndicator
---------- -------------
         0 =>
         1 <=

ConvertTo-Html

ConvertTo-Html peut convertir une collection d’objets en table HTML. Les propriétés calculées vous permettent de contrôler la façon dont la table est présentée.

Get-Alias |
  ConvertTo-Html Name,
                 Definition,
                 @{
                    name='ParameterCount'
                    expr={$_.Parameters.Keys.Count}
                    align='center'
                 } |
    Out-File .\aliases.htm -Force

Cet exemple crée une table HTML contenant une liste d’alias PowerShell et les paramètres de nombre pour chaque commande alias. Les valeurs de la colonne ParameterCount sont centrées.

Format-Custom

Format-Custom fournit une vue personnalisée d’un objet dans un format similaire à une définition de classe. Les objets plus complexes peuvent contenir des membres profondément imbriqués avec des types complexes. Paramètre De profondeur de Format-Custom spécifie la profondeur d’expansion pour toutes les propriétés. La depth clé vous permet de spécifier la profondeur d’expansion par propriété.

Dans cet exemple, la depth clé simplifie la sortie personnalisée de l’applet de Get-Date commande. Get-Date retourne un objet DateTime . La propriété Date de cet objet est également un objet DateTime . L’objet est donc imbriqué.

Get-Date | Format-Custom @{expr={$_.Date};depth=1},TimeOfDay
class DateTime
{
  $_.Date =
    class DateTime
    {
      Date = 8/7/2020 12:00:00 AM
      Day = 7
      DayOfWeek = Friday
      DayOfYear = 220
      Hour = 0
      Kind = Local
      Millisecond = 0
      Minute = 0
      Month = 8
      Second = 0
      Ticks = 637323552000000000
      TimeOfDay = 00:00:00
      Year = 2020
      DateTime = Friday, August 07, 2020 12:00:00 AM
    }
  TimeOfDay =
    class TimeSpan
    {
      Ticks = 435031592302
      Days = 0
      Hours = 12
      Milliseconds = 159
      Minutes = 5
      Seconds = 3
      TotalDays = 0.503508787386574
      TotalHours = 12.0842108972778
      TotalMilliseconds = 43503159.2302
      TotalMinutes = 725.052653836667
      TotalSeconds = 43503.1592302
    }
}

Format-List

Dans cet exemple, nous utilisons des propriétés calculées pour modifier le nom et le format de la sortie Get-ChildItem.

Get-ChildItem *.json -File |
  Format-List Fullname,
              @{
                 name='Modified'
                 expression={$_.LastWriteTime}
                 formatstring='O'
              },
              @{
                 name='Size'
                 expression={$_.Length/1KB}
                 formatstring='N2'
              }
FullName : C:\Git\PS-Docs\PowerShell-Docs\.markdownlint.json
Modified : 2020-07-23T10:26:28.4092457-07:00
Size     : 2.40

FullName : C:\Git\PS-Docs\PowerShell-Docs\.openpublishing.publish.config.json
Modified : 2020-07-23T10:26:28.4092457-07:00
Size     : 2.25

FullName : C:\Git\PS-Docs\PowerShell-Docs\.openpublishing.redirection.json
Modified : 2020-07-27T13:05:24.3887629-07:00
Size     : 324.60

Format-Table

Dans cet exemple, la propriété calculée ajoute une propriété Type utilisée pour classifier les fichiers par le type de contenu.

Get-ChildItem -File |
  Sort-Object extension |
    Format-Table Name, Length -GroupBy @{
      name='Type'
      expression={
        switch ($_.extension) {
          '.md'   {'Content'}
          ''      {'Metacontent'}
          '.ps1'  {'Automation'}
          '.yml'  {'Automation'}
          default {'Configuration'}
        }
      }
    }
   Type: Metacontent

Name              Length
----              ------
ThirdPartyNotices   1229
LICENSE-CODE        1106
LICENSE            19047

   Type: Configuration

Name                                Length
----                                ------
.editorconfig                          183
.gitattributes                         419
.gitignore                             228
.markdownlint.json                    2456
.openpublishing.publish.config.json   2306
.openpublishing.redirection.json    332394
.localization-config                   232

   Type: Content

Name            Length
----            ------
README.md         3355
CONTRIBUTING.md    247

   Type: Automation

Name                      Length
----                      ------
.openpublishing.build.ps1    796
build.ps1                   7495
ci.yml                       645
ci-steps.yml                2035
daily.yml                   1271

Format-Wide

L’applet Format-Wide de commande vous permet d’afficher la valeur d’une propriété pour les objets d’une collection sous la forme d’une liste à plusieurs colonnes.

Pour cet exemple, nous voulons voir le nom de fichier et la taille (en kilo-octets) comme une liste large. Comme Format-Wide n’affiche pas plusieurs propriétés, nous utilisons une propriété calculée pour combiner la valeur de deux propriétés en une seule valeur.

Get-ChildItem -File |
  Format-Wide -Property @{e={'{0} ({1:N2}kb)' -f $_.name,($_.length/1kb)}}
.editorconfig (0.18kb)                          .gitattributes (0.41kb)
.gitignore (0.22kb)                             .localization-config (0.23kb)
.markdownlint.json (2.40kb)                     .openpublishing.build.ps1 (0.78kb)
.openpublishing.publish.config.json (2.25kb)    .openpublishing.redirection.json (324.60kb)
build.ps1 (7.32kb)                              ci.yml (0.63kb)
ci-steps.yml (1.99kb)                           CONTRIBUTING.md (0.24kb)
daily.yml (1.24kb)                              LICENSE (18.60kb)
LICENSE-CODE (1.08kb)                           README.md (3.28kb)
ThirdPartyNotices (1.20kb)

Group-Object

L’applet Group-Object de commande affiche des objets dans des groupes en fonction de la valeur d’une propriété spécifiée. Dans cet exemple, la propriété calculée compte le nombre de fichiers de chaque type de contenu.

Get-ChildItem -File |
  Sort-Object extension |
    Group-Object -NoElement -Property @{
      expression={
        switch ($_.extension) {
          '.md'   {'Content'}
          ''      {'Metacontent'}
          '.ps1'  {'Automation'}
          '.yml'  {'Automation'}
          default {'Configuration'}
        }
      }
    }
Count Name
----- ----
    5 Automation
    7 Configuration
    2 Content
    3 Metacontent

Measure-Object

L’applet Measure-Object de commande calcule les propriétés numériques des objets. Dans cet exemple, nous utilisons une propriété calculée pour obtenir le nombre de nombres compris entre 1 et 10 qui sont uniformément divisibles par 3.

Le bloc de script retourne $true si le nombre est divisible de 3 et $false pour tous les autres nombres. L’opération Sum traite les $true valeurs comme 1 et $false les valeurs comme 0.

1..10 | Measure-Object -Property {($_ % 3) -eq 0} -Sum
Count             : 10
Average           :
Sum               : 3
Maximum           :
Minimum           :
StandardDeviation :
Property          : ($_ % 3) -eq 0

Remarque

Contrairement aux autres applets de commande, Measure-Object n’accepte pas de table de hachage pour les propriétés calculées. Vous devez utiliser un bloc de script.

Select-Object

Vous pouvez utiliser des propriétés calculées pour ajouter des membres supplémentaires à la sortie des objets avec l’applet de Select-Object commande. Dans cet exemple, nous énumérons les alias PowerShell qui commencent par la lettre C. À l’aide Select-Objectde , nous exécréons l’alias, l’applet de commande à laquelle elle est mappée et le nombre de paramètres définis pour l’applet de commande. À l’aide d’une propriété calculée, nous pouvons créer la propriété ParameterCount .

$aliases = Get-Alias c* |
  Select-Object Name,
                Definition,
                @{
                    name='ParameterCount'
                    expr={$_.Parameters.Keys.Count}
                }
$aliases | Get-Member
$aliases
   TypeName: Selected.System.Management.Automation.AliasInfo

Name           MemberType   Definition
----           ----------   ----------
Equals         Method       bool Equals(System.Object obj)
GetHashCode    Method       int GetHashCode()
GetType        Method       type GetType()
ToString       Method       string ToString()
Definition     NoteProperty string Definition=Get-Content
Name           NoteProperty string Name=cat
ParameterCount NoteProperty System.Int32 ParameterCount=21

Name    Definition         ParameterCount
----    ----------         --------------
cat     Get-Content                    21
cd      Set-Location                   15
cdd     Push-MyLocation                 1
chdir   Set-Location                   15
clc     Clear-Content                  20
clear   Clear-Host                      0
clhy    Clear-History                  17
cli     Clear-Item                     20
clp     Clear-ItemProperty             22
cls     Clear-Host                      0
clv     Clear-Variable                 19
cnsn    Connect-PSSession              29
compare Compare-Object                 20
copy    Copy-Item                      24
cp      Copy-Item                      24
cpi     Copy-Item                      24
cpp     Copy-ItemProperty              23
cvpa    Convert-Path                   13

Sort-Object

À l’aide des propriétés calculées, vous pouvez trier les données dans différentes commandes par propriété. Cet exemple trie les données d’un fichier CSV dans l’ordre croissant par date. Mais dans chaque date, il trie les lignes dans l’ordre décroissant par UnitsSold.

Import-Csv C:\temp\sales-data.csv |
  Sort-Object Date, @{expr={$_.UnitsSold}; desc=$true}, Salesperson  |
    Select-Object Date, Salesperson, UnitsSold
Date       Salesperson UnitsSold
----       ----------- ---------
2020-08-01 Sally       3
2020-08-01 Anne        2
2020-08-01 Fred        1
2020-08-02 Anne        6
2020-08-02 Fred        2
2020-08-02 Sally       0
2020-08-03 Anne        5
2020-08-03 Sally       3
2020-08-03 Fred        1
2020-08-04 Anne        2
2020-08-04 Fred        2
2020-08-04 Sally       2

Notes

  • Vous pouvez spécifier directement le bloc de script d’expression, en tant qu’argument, plutôt que de le spécifier comme Expression entrée dans une table de hachage. Par exemple :

    '1', '10', '2' | Sort-Object { [int] $_ }
    

    Cet exemple est pratique pour les applets de commande qui ne nécessitent pas (ou ne prennent pas en charge) l’affectation d’un nom à une propriété via la Name clé, par Sort-Objectexemple , Group-Objectet Measure-Object.

    Pour les applets de commande qui prennent en charge le nommage de la propriété, le bloc de script est converti en chaîne et utilisé comme nom de la propriété dans la sortie.

  • Expression Les blocs de script s’exécutent dans des étendues enfants , ce qui signifie que les variables de l’appelant ne peuvent pas être directement modifiées.

  • La logique de pipeline est appliquée à la sortie des blocs de Expression script. Cela signifie que la sortie d’un tableau à élément unique entraîne l’annulation de l’annulation de ce tableau.

  • Pour la plupart des applets de commande, les erreurs dans les blocs de script d’expression sont ignorées silencieusement. Pour Sort-Objectles erreurs de fin d’instruction et de fin de script sont générées, mais elles ne terminent pas l’instruction.

Voir aussi