Freigeben über


about_Calculated_Properties

Kurzbeschreibung

PowerShell bietet die Möglichkeit, neue Eigenschaften dynamisch hinzuzufügen und die Formatierung von Objekten zu ändern, die an die Pipeline ausgegeben werden.

Lange Beschreibung

Mehrere PowerShell-Cmdlets transformieren, gruppieren oder verarbeiten Eingabeobjekte in Ausgabeobjekte mithilfe von Parametern, mit denen Sie neue Eigenschaften für diese Ausgabeobjekte erstellen können. Mit diesen Parametern können Sie neue, berechnete Eigenschaften für Ausgabeobjekte basierend auf den Werten von Eingabeobjekten generieren. Auf das Eingabeobjekt kann über die $_ oder $PSItem die automatische Variable innerhalb des Elements zugegriffen werden, auf die Expression eine berechnete Eigenschaft zugegriffen werden kann.

Die berechnete Eigenschaft wird als Hashtable definiert, die Schlüsselwertpaare enthält, die den Wert der neu berechneten Eigenschaft angeben. Einige Befehle unterstützen andere Schlüsselwertpaare, die steuern, wie die Eigenschaft in der Ausgabe angezeigt wird.

Unterstützte Cmdlets

Die folgenden Cmdlets unterstützen berechnete Eigenschaftswerte für den Parameter Property. Die Format-*-Cmdlets unterstützen auch berechnete Werte für den parameter GroupBy.

In der folgenden Liste werden die Cmdlets aufgeführt, die berechnete Eigenschaften und die Schlüsselwertpaare unterstützen, die von den einzelnen Cmdlets unterstützt werden.

  • Compare-Object

    • Expression
  • ConvertTo-Html

    • Name / Label – optional (in PowerShell 6.x hinzugefügt)
    • Expression
    • Width – optional
    • Alignment – optional
  • Format-Custom

    • Expression
    • Depth – optional
  • Format-List

    • Name / Label – optional
    • Expression
    • FormatString – optional

    Dieser Satz von Schlüssel-Wert-Paaren gilt auch für berechnete Eigenschaftswerte, die an den GroupBy Parameter für alle Format-* Cmdlets übergeben werden.

  • Format-Table

    • Name / Label – optional
    • Expression
    • FormatString – optional
    • Width – optional
    • Alignment – optional
  • Format-Wide

    • Expression
    • FormatString – optional
  • Group-Object

    • Expression
  • Measure-Object

    • Unterstützt nur einen Scriptblock für den Ausdruck, nicht eine Hashtabelle.
    • In PowerShell 5.1 und älter nicht unterstützt.
  • Select-Object

    • Name / Label – optional
    • Expression
  • Sort-Object

    • Expression
    • Ascending / Descending – optional

Anmerkung

Der Wert des Werts Expression kann ein Scriptblock anstelle einer Hashtabelle sein. Weitere Informationen finden Sie im Abschnitt Notizen.

Hashtable-Schlüsseldefinitionen

  • Name / Label – Gibt den Namen der zu erstellenden Eigenschaft an. Sie können Name oder ihren Alias, Label, austauschbar verwenden.
  • Expression - Eine Zeichenfolge oder ein Skriptblock, die zum Berechnen des Werts der neuen Eigenschaft verwendet wird. Wenn es sich bei dem Expression um eine Zeichenfolge handelt, wird der Wert als Eigenschaftsname für das Eingabeobjekt interpretiert. Dies ist eine kürzere Option als Expression = { $_.<PropertyName> }.
  • Alignment – Wird von Cmdlets verwendet, die tabellarische Ausgabe erzeugen, um zu definieren, wie die Werte in einer Spalte angezeigt werden. Der Wert muss 'Left', 'Center'oder 'Right'sein.
  • FormatString – Gibt eine Formatzeichenfolge an, die definiert, wie der Wert für die Ausgabe formatiert wird. Weitere Informationen zu Formatzeichenfolgen finden Sie unter Formattypen in .NET.
  • Width – Gibt die Spalte für die maximale Breite in einer Tabelle an, wenn der Wert angezeigt wird. Der Wert muss größer als 0sein.
  • Depth – Der parameter Depth von Format-Custom gibt die Tiefe der Erweiterung für alle Eigenschaften an. Mit dem schlüssel Depth können Sie die Tiefe der Erweiterung pro Eigenschaft angeben.
  • Ascending / Descending – Ermöglicht Ihnen das Angeben der Sortierreihenfolge für eine oder mehrere Eigenschaften. Dies sind boolesche Werte.

Sie müssen die Hashtableschlüssel nicht so großschreiben, dass das angegebene Namenspräfix eindeutig ist. Sie können z. B. n anstelle von Name und e anstelle von Expressionverwenden.

Examples

Compare-Object

Mit berechneten Eigenschaften können Sie steuern, wie die Eigenschaften der Eingabeobjekte verglichen werden. In diesem Beispiel werden die Werte nicht direkt verglichen, sondern mit dem Ergebnis der arithmetischen Operation (Modulus von 2) verglichen.

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

ConvertTo-Html

ConvertTo-Html kann eine Auflistung von Objekten in eine HTML-Tabelle konvertieren. Mit berechneten Eigenschaften können Sie steuern, wie die Tabelle dargestellt wird.

Get-Alias |
  ConvertTo-Html Name,
                 Definition,
                 @{
                    Name='ParameterCount'
                    Expr={$_.Parameters.Keys.Count}
                    Align='Center'
                 } |
    Out-File .\aliases.htm -Force

In diesem Beispiel wird eine HTML-Tabelle erstellt, die eine Liste von PowerShell-Aliasen und die Zahlenparameter für jeden aliasierten Befehl enthält. Die Werte ParameterCount Spalte werden zentriert.

Format-Custom

Format-Custom stellt eine benutzerdefinierte Ansicht eines Objekts in einem Format bereit, das einer Klassendefinition ähnelt. Komplexere Objekte können Elemente enthalten, die tief mit komplexen Typen verschachtelt sind. Der parameter Depth von Format-Custom gibt die Tiefe der Erweiterung für alle Eigenschaften an. Mit dem schlüssel Depth können Sie die Tiefe der Erweiterung pro Eigenschaft angeben.

In diesem Beispiel vereinfacht der Depth-Schlüssel die benutzerdefinierte Ausgabe für das Cmdlet Get-Date. Get-Date gibt ein DateTime--Objekt zurück. Die Date-Eigenschaft dieses Objekts ist auch ein DateTime--Objekt, sodass das Objekt geschachtelt ist.

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 diesem Beispiel verwenden wir berechnete Eigenschaften, um den Namen und das Format der Ausgabe von Get-ChildItemzu ändern.

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 diesem Beispiel fügt die berechnete Eigenschaft eine Type-Eigenschaft hinzu, die zum Klassifizieren der Dateien nach dem Inhaltstyp verwendet wird.

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

Mit dem Cmdlet Format-Wide können Sie den Wert einer Eigenschaft für Objekte in einer Auflistung als mehrspaltige Liste anzeigen.

In diesem Beispiel möchten wir den Dateinamen und die Größe (in Kilobyte) als breite Auflistung anzeigen. Da Format-Wide nicht mehr als eine Eigenschaft anzeigt, verwenden wir eine berechnete Eigenschaft, um den Wert von zwei Eigenschaften in einem einzelnen Wert zu kombinieren.

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

Das Cmdlet Group-Object zeigt Objekte in Gruppen basierend auf dem Wert einer angegebenen Eigenschaft an. In diesem Beispiel zählt die berechnete Eigenschaft die Anzahl der Dateien jedes Inhaltstyps.

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

Das Cmdlet Measure-Object berechnet die numerischen Eigenschaften von Objekten. In diesem Beispiel verwenden wir eine berechnete Eigenschaft, um die Anzahl der Zahlen zwischen 1 und 10 abzurufen, die gleichmäßig durch 3 divisierbar sind.

Der Scriptblock gibt zurück $true , wenn die Zahl durch 3 divisierbar ist und $false für alle anderen Zahlen. Der vorgang Summe behandelt $true Werte als 1 und $false Werte als 0.

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

Anmerkung

Im Gegensatz zu den anderen Cmdlets akzeptiert Measure-Object keine Hashtabelle für berechnete Eigenschaften. Sie müssen einen Scriptblock verwenden.

Select-Object

Sie können berechnete Eigenschaften verwenden, um den Objekten, die mit dem Cmdlet Select-Object ausgegeben werden, zusätzliche Member hinzuzufügen. In diesem Beispiel werden die PowerShell-Aliase aufgeführt, die mit dem Buchstaben Cbeginnen. Mit Select-Objectgeben wir den Alias, das Cmdlet, dem es zugeordnet ist, und eine Anzahl für die Anzahl der parameter aus, die für das Cmdlet definiert sind. Mithilfe einer berechneten Eigenschaft können wir die eigenschaft ParameterCount erstellen.

$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

Mithilfe der berechneten Eigenschaften können Sie Daten in verschiedenen Reihenfolgen pro Eigenschaft sortieren. In diesem Beispiel werden Daten aus einer CSV-Datei in aufsteigender Reihenfolge nach Datumsortiert. Innerhalb jedes Datums werden die Zeilen jedoch in absteigender Reihenfolge nach UnitsSold-sortiert.

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

Hinweise

  • Sie können den Ausdrucksskriptblock direkt als Argument angeben, anstatt ihn als Expression Eintrag in einer Hashtabelle anzugeben. Zum Beispiel:

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

    Dieses Beispiel eignet sich für Cmdlets, die keine Eigenschaft über den Name-Schlüssel benennen müssen (oder unterstützen), z. B. Sort-Object, Group-Objectund Measure-Object.

    Für Cmdlets, die die Benennung der Eigenschaft unterstützen, wird der Scriptblock in eine Zeichenfolge konvertiert und als Name der Eigenschaft in der Ausgabe verwendet.

  • Expression Scriptblocks werden in untergeordneten Bereichen ausgeführt, was bedeutet, dass die Variablen des Aufrufers nicht direkt geändert werden können.

  • Pipelinelogik wird auf die Ausgabe von Expression Scriptblocks angewendet. Dies bedeutet, dass die Ausgabe eines Einelementarrays bewirkt, dass das Array nicht mehr angewendet wird.

  • Bei den meisten Cmdlets werden Fehler innerhalb von Ausdrucksskriptblocks leise ignoriert. Bei Sort-Objectwerden Fehler beim Beenden von Anweisungen und Skripts Ausgabe, aber sie beenden die Anweisung nicht.

Siehe auch