about_Calculated_Properties

Korte beschrijving

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

Lange beschrijving

Verschillende PowerShell-cmdlets transformeren, groeperen of verwerken invoerobjecten in uitvoerobjecten met behulp van parameters waarmee nieuwe eigenschappen kunnen worden toegevoegd aan deze uitvoerobjecten. U kunt deze parameters gebruiken om nieuwe, berekende eigenschappen te genereren voor uitvoerobjecten 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 voor het berekenen van de waarde 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 ondersteuning bieden voor berekende eigenschappen 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 GroupBy-parameter 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 hashtabel.
    • 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 waarde kan een scriptblok zijn in plaats van een hashtabel. Zie de sectie Notities voor meer informatie.

Hashtable-sleuteldefinities

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

U hoeft de hashtable-sleutels niet te spellen zolang het opgegeven naamvoorvoegsel ondubbelzinnig is. U kunt n bijvoorbeeld in plaats van Name en e in plaats van Expression.

Voorbeelden

Compare-Object

Met berekende eigenschappen kunt u bepalen hoe de eigenschappen van de invoerobjecten worden vergeleken. In dit voorbeeld worden de waarden vergeleken met het resultaat van de rekenkundige bewerking (modulus van 2) in plaats van de waarden rechtstreeks te vergelijken.

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 opdracht met aliassen. 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 diepte van de uitbreiding voor alle eigenschappen op. Met depth de sleutel kunt u de diepte van 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 opmaak van de uitvoer te wijzigen.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

In dit voorbeeld wordt met de berekende eigenschap een eigenschap Type toegevoegd die wordt gebruikt om de bestanden te classificeren op basis van het 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 er 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 weer in groepen op basis van de waarde van een opgegeven eigenschap. In dit voorbeeld telt de berekende eigenschap het aantal bestanden van elk inhoudstype.

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) van de getallen op te halen, 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 u 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 uitvoer van objecten met de Select-Object cmdlet. In dit voorbeeld worden de PowerShell-aliassen vermeld die beginnen met de letter C. Met behulp van Select-Object, voeren 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 orders per eigenschap sorteren. In dit voorbeeld worden gegevens uit een CSV-bestand gesorteerd in oplopende volgorde op datum. Maar binnen elke datum worden de rijen in aflopende volgorde gesorteerd op Eenhedensold.

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

Opmerkingen

  • U kunt het scriptblok voor expressies rechtstreeks opgeven, als argument, in plaats van het op te geven als vermelding Expression in een hashtabel. Voorbeeld:

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

    Dit voorbeeld is handig voor cmdlets die geen naam voor een eigenschap vereisen (of ondersteunen) via de Name sleutel, 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 de matrix wordt uitgepakt.

  • Voor de meeste cmdlets worden fouten in expressiescriptblokken stil genegeerd. Voor fouten bij Sort-Objecthet beëindigen van instructies en scripts zijn uitvoerfouten , maar worden de instructie niet beëindigd.

Zie ook