Delen via


about_Calculated_Properties

Korte beschrijving

PowerShell biedt de mogelijkheid om dynamisch nieuwe eigenschappen toe te voegen en de opmaak van objectuitvoer naar de pijplijn te wijzigen.

Lange beschrijving

Met verschillende PowerShell-cmdlets worden invoerobjecten getransformeerd, gegroepeerd of verwerkt in uitvoerobjecten met behulp van parameters waarmee nieuwe eigenschappen aan deze uitvoerobjecten kunnen worden toegevoegd. U kunt deze parameters gebruiken om nieuwe, berekende eigenschappen voor uitvoerobjecten te genereren op basis van de waarden van invoerobjecten. De berekende eigenschap wordt gedefinieerd door een hashtabel met sleutel-waardeparen die de naam van de nieuwe eigenschap opgeven, een expressie om de waarde te berekenen en optionele opmaakgegevens.

Ondersteunde cmdlets

De volgende cmdlets ondersteunen berekende eigenschapswaarden voor de parameter Eigenschap . De Format-* cmdlets ondersteunen ook berekende waarden voor de parameter GroupBy .

De volgende lijst bevat een overzicht van de cmdlets die berekende eigenschappen ondersteunen en de sleutel-waardeparen die door elke cmdlet worden ondersteund.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label - optioneel (toegevoegd in PowerShell 6.x)
    • expression
    • width -Optionele
    • alignment -Optionele
  • Format-Custom

    • expression
    • depth -Optionele
  • Format-List

    • name/label -Optionele
    • expression
    • formatstring -Optionele

    Dezelfde set sleutel-waardeparen is ook van toepassing op berekende eigenschapswaarden die worden doorgegeven aan de parameter GroupBy voor alle Format-* cmdlets.

  • Format-Table

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

    • expression
    • formatstring -Optionele
  • Group-Object

    • expression
  • Measure-Object

    • Ondersteunt alleen een scriptblok voor de expressie, niet een hashtable.
    • Niet ondersteund in PowerShell 5.1 en ouder.
  • Select-Object

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

    • expression
    • ascending/descending -Optionele

Notitie

De waarde van de expression kan een scriptblok zijn in plaats van een hashtabel. Zie de sectie Notities voor meer informatie.

Hashtabelsleuteldefinities

  • name/label - Hiermee geeft u de naam van de eigenschap die wordt gemaakt. U kunt of de alias , labeldoor elkaar gebruikenname.
  • expression - Een tekenreeks of scriptblok dat wordt gebruikt om de waarde van de nieuwe eigenschap te berekenen. Als de expression een tekenreeks is, wordt de waarde geïnterpreteerd als een eigenschapsnaam op het invoerobject. Dit is een kortere optie dan expression = { $_.<PropertyName> }.
  • alignment - Wordt gebruikt door cmdlets die uitvoer in tabelvorm produceren om te definiëren hoe de waarden worden weergegeven in een kolom. De waarde moet , 'center'of 'right'zijn'left'.
  • formatstring - Hiermee geeft u een notatietekenreeks op die definieert hoe de waarde wordt opgemaakt voor uitvoer. Zie Opmaaktypen in .NET voor meer informatie over opmaaktekenreeksen.
  • width - Hiermee geeft u de kolom met de maximale breedte in een tabel op wanneer de waarde wordt weergegeven. De waarde moet groter zijn dan 0.
  • depth - De parameter Diepte van Format-Custom geeft de diepte van de uitbreiding voor alle eigenschappen op. Met de depth sleutel kunt u de diepte van de uitbreiding per eigenschap opgeven.
  • ascending / descending - Hiermee kunt u de sorteervolgorde opgeven voor een of meer eigenschappen. Dit zijn booleaanse waarden.

U hoeft de hashtabelsleutels niet te spellen zolang het opgegeven naamvoorvoegsel ondubbelzinnig is. U kunt bijvoorbeeld in plaats van en gebruiken n in plaats van Expression.eName

Voorbeelden

Compare-Object

Met berekende eigenschappen kunt u bepalen hoe de eigenschappen van de invoerobjecten worden vergeleken. In dit voorbeeld worden de waarden niet rechtstreeks vergeleken, maar vergeleken met het resultaat van de rekenkundige bewerking (modulus van 2).

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

ConvertTo-Html

ConvertTo-Html kan een verzameling objecten converteren naar een HTML-tabel. Met berekende eigenschappen kunt u bepalen hoe de tabel wordt weergegeven.

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

In dit voorbeeld wordt een HTML-tabel gemaakt met een lijst met PowerShell-aliassen en de getalparameters voor elke aliasopdracht. De waarden van de kolom ParameterCount zijn gecentreerd.

Format-Custom

Format-Custom biedt een aangepaste weergave van een object in een indeling die vergelijkbaar is met een klassedefinitie. Complexere objecten kunnen leden bevatten die diep zijn genest met complexe typen. De parameter Diepte van Format-Custom geeft de uitbreidingsdiepte voor alle eigenschappen op. Met de depth sleutel kunt u de diepte van de uitbreiding per eigenschap opgeven.

In dit voorbeeld vereenvoudigt de depth sleutel de aangepaste uitvoer voor de Get-Date cmdlet. Get-Date retourneert een DateTime-object . De eigenschap Date van dit object is ook een DateTime-object , dus het object is genest.

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

In dit voorbeeld gebruiken we berekende eigenschappen om de naam en indeling van de uitvoer van Get-ChildItemte wijzigen.

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

In dit voorbeeld voegt de berekende eigenschap een eigenschap Type toe die wordt gebruikt om de bestanden te classificeren op inhoudstype.

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

Met Format-Wide de cmdlet kunt u de waarde van één eigenschap voor objecten in een verzameling weergeven als een lijst met meerdere kolommen.

In dit voorbeeld willen we de bestandsnaam en de grootte (in kilobytes) zien als een brede lijst. Omdat Format-Wide niet meer dan één eigenschap wordt weergegeven, gebruiken we een berekende eigenschap om de waarde van twee eigenschappen te combineren tot één waarde.

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

De Group-Object cmdlet geeft objecten in groepen weer op basis van de waarde van een opgegeven eigenschap. In dit voorbeeld wordt met de berekende eigenschap het aantal bestanden van elk inhoudstype geteld.

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

De Measure-Object cmdlet berekent de numerieke eigenschappen van objecten. In dit voorbeeld gebruiken we een berekende eigenschap om het aantal (som) op te halen van de getallen, tussen 1 en 10, die gelijkmatig deelbaar zijn door 3.

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

Notitie

In tegenstelling tot de andere cmdlets accepteert Measure-Object geen hashtabel voor berekende eigenschappen. U moet een scriptblok gebruiken.

Select-Object

U kunt berekende eigenschappen gebruiken om extra leden toe te voegen aan de objectuitvoer met de Select-Object cmdlet. In dit voorbeeld vermelden we de PowerShell-aliassen die beginnen met de letter C. Met behulp van Select-Objectvoeren we de alias uit, de cmdlet waaraan deze is toegewezen en een telling voor het aantal parameters dat is gedefinieerd voor de cmdlet. Met behulp van een berekende eigenschap kunnen we de eigenschap ParameterCount maken.

$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

Met behulp van de berekende eigenschappen kunt u gegevens in verschillende volgordes per eigenschap sorteren. In dit voorbeeld worden gegevens uit een CSV-bestand in oplopende volgorde gesorteerd op datum. Maar binnen elke datum worden de rijen in aflopende volgorde gesorteerd op 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

Notities

  • U kunt het expressiescriptblok rechtstreeks als argument opgeven in plaats van het op te geven als de Expression vermelding in een hashtabel. Bijvoorbeeld:

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

    Dit voorbeeld is handig voor cmdlets waarvoor geen naamgeving van een eigenschap via de Name sleutel is vereist (of wordt ondersteund), zoals Sort-Object, Group-Objecten Measure-Object.

    Voor cmdlets die ondersteuning bieden voor de naamgeving van de eigenschap, wordt het scriptblok geconverteerd naar een tekenreeks en gebruikt als de naam van de eigenschap in de uitvoer.

  • Expression scriptblokken worden uitgevoerd in onderliggende bereiken, wat betekent dat de variabelen van de aanroeper niet rechtstreeks kunnen worden gewijzigd.

  • Pijplijnlogica wordt toegepast op de uitvoer van Expression scriptblokken. Dit betekent dat het uitvoeren van een matrix met één element ervoor zorgt dat die matrix wordt uitgepakt.

  • Voor de meeste cmdlets worden fouten in expressiescriptblokken op de achtergrond genegeerd. Voor Sort-Objectzijn instructie- en scriptbeëindigingsfouten uitvoer , maar de instructie wordt niet beëindigd.

Zie ook