about_Calculated_Properties
Kurze Beschreibung
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, die das Hinzufügen neuer Eigenschaften zu diesen Ausgabeobjekten ermöglichen. Mit diesen Parametern können Sie neue, berechnete Eigenschaften für Ausgabeobjekte basierend auf den Werten von Eingabeobjekten generieren. Die berechnete Eigenschaft wird durch eine Hashtabelle definiert, die Schlüsselwertpaare enthält, die den Namen der neuen Eigenschaft, einen Ausdruck zum Berechnen des Werts und optionale Formatierungsinformationen angeben.
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 GroupBy-Parameter .
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
-wahlfreialignment
-wahlfrei
Format-Custom
expression
depth
-wahlfrei
Format-List
name
/label
-wahlfreiexpression
formatstring
-wahlfrei
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
-wahlfreiexpression
formatstring
-wahlfreiwidth
-wahlfreialignment
-wahlfrei
Format-Wide
expression
formatstring
-wahlfrei
Group-Object
expression
Measure-Object
- Unterstützt nur einen Skriptblock für den Ausdruck, nicht eine Hashtabelle.
- In PowerShell 5.1 und älter nicht unterstützt.
Select-Object
name
/label
-wahlfreiexpression
Sort-Object
expression
ascending
/descending
-wahlfrei
Hinweis
Der Wert des expression
Skriptblocks kann anstelle einer Hashtabelle ein Skriptblock sein. Weitere Informationen finden Sie im Abschnitt Hinweise.
Hashtable-Schlüsseldefinitionen
name
/label
- Gibt den Namen der zu erstellenden Eigenschaft an. Sie können den Aliaslabel
, austauschbar verwendenname
.expression
- Ein Zeichenfolgen- oder Skriptblock, der zum Berechnen des Werts der neuen Eigenschaft verwendet wird. Wenn es sichexpression
um eine Zeichenfolge handelt, wird der Wert als Eigenschaftsname für das Eingabeobjekt interpretiert. Dies ist eine kürzere Option alsexpression = { $_.<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 ist. 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 als0
sein.depth
- Der Tiefenparameter vonFormat-Custom
specifies the depth of expansion for all properties. Mitdepth
dem Schlüssel können Sie die Tiefe der Erweiterung pro Eigenschaft angeben.ascending
/descending
– Ermöglicht ihnen, die Sortierreihenfolge für eine oder mehrere Eigenschaften anzugeben. Dies sind boolesche Werte.
Sie müssen die Hashtableschlüssel nicht so großschreiben, dass das angegebene Namenspräfix eindeutig ist. Sie können n
z. B. anstelle von Name
und e
anstelle von Expression
.
Beispiele
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 der 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 Depth-Parameter von Format-Custom
specifies the depth of expansion for all properties. Mit depth
dem Schlüssel können Sie die Tiefe der Erweiterung pro Eigenschaft angeben.
In diesem Beispiel vereinfacht der depth
Schlüssel die benutzerdefinierte Ausgabe für das Get-Date
Cmdlet. 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-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 diesem Beispiel fügt die berechnete Eigenschaft eine Type-Eigenschaft hinzu, die verwendet wird, um die Dateien nach dem Inhaltstyp zu klassifizieren.
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 Format-Wide
Cmdlet 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 angezeigt wird, 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 Group-Object
Cmdlet 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 Measure-Object
Cmdlet 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 Skriptblock gibt zurück $true
, wenn die Zahl durch 3 divisierbar ist und $false
für alle anderen Zahlen. Der Sum-Vorgang 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
Hinweis
Im Gegensatz zu den anderen Cmdlets Measure-Object
akzeptiert keine Hashtabelle für berechnete Eigenschaften. Sie müssen einen Skriptblock verwenden.
Select-Object
Sie können berechnete Eigenschaften verwenden, um der Ausgabe der Objekte mit dem Select-Object
Cmdlet zusätzliche Member hinzuzufügen. In diesem Beispiel werden die PowerShell-Aliase aufgeführt, die mit dem Buchstaben C
beginnen. Mit Select-Object
dieser Methode geben 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 ParameterCount-Eigenschaft 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 Datum sortiert. 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), zSort-Object
. B. ,Group-Object
undMeasure-Object
.Für Cmdlets, die die Benennung der Eigenschaft unterstützen, wird der Skriptblock in eine Zeichenfolge konvertiert und als Name der Eigenschaft in der Ausgabe verwendet.
Expression
Skriptblöcke 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
Skriptblöcken angewendet. Dies bedeutet, dass die Ausgabe eines Einelementarrays bewirkt, dass das Array nicht mehr angewendet wird.Bei den meisten Cmdlets werden Fehler in Ausdrucksskriptblöcken leise ignoriert. Für
Sort-Object
, Anweisungsbeendigung und Skriptbeendfehler werden ausgegeben , aber sie beenden die Anweisung nicht.