about_Calculated_Properties
Kort beskrivning
PowerShell ger möjlighet att dynamiskt lägga till nya egenskaper och ändra formateringen av objektutdata till pipelinen.
Lång beskrivning
Flera PowerShell-cmdletar transformerar, grupperar eller bearbetar indataobjekt till utdataobjekt med hjälp av parametrar som tillåter tillägg av nya egenskaper till dessa utdataobjekt. Du kan använda dessa parametrar för att generera nya beräknade egenskaper för utdataobjekt baserat på värdena för indataobjekt. Den beräknade egenskapen definieras av en hashtabell som innehåller nyckel/värde-par som anger namnet på den nya egenskapen, ett uttryck för att beräkna värdet och valfri formateringsinformation.
Cmdletar som stöds
Följande cmdletar stöder beräknade egenskapsvärden för egenskapsparametern. Cmdletarna Format-*
stöder också beräknade värden för parametern GroupBy .
I följande lista specificeras de cmdletar som stöder beräknade egenskaper och nyckel/värde-par som varje cmdlet stöder.
Compare-Object
expression
ConvertTo-Html
name
/label
– valfritt (läggs till i PowerShell 6.x)expression
width
-valfrialignment
-valfri
Format-Custom
expression
depth
-valfri
Format-List
name
/label
-valfriexpression
formatstring
-valfri
Samma uppsättning nyckel/värde-par gäller även för beräknade egenskapsvärden som skickas till GroupBy-parametern för alla
Format-*
cmdletar.Format-Table
name
/label
-valfriexpression
formatstring
-valfriwidth
-valfrialignment
-valfri
Format-Wide
expression
formatstring
-valfri
Group-Object
expression
Measure-Object
- Stöder endast ett skriptblock för uttrycket, inte en hashtable.
- Stöds inte i PowerShell 5.1 och äldre.
Select-Object
name
/label
-valfriexpression
Sort-Object
expression
ascending
/descending
-valfri
Kommentar
Värdet för expression
kan vara ett skriptblock i stället för en hashtable. Mer information finns i avsnittet Anteckningar .
Hashtable-nyckeldefinitioner
name
/label
– Anger namnet på den egenskap som skapas. Du kan användaname
eller dess alias,label
, utbytbart.expression
– Ett sträng- eller skriptblock som används för att beräkna värdet för den nya egenskapen.expression
Om är en sträng tolkas värdet som ett egenskapsnamn på indataobjektet. Det här är ett kortare alternativ änexpression = { $_.<PropertyName> }
.alignment
– Används av cmdletar som producerar tabellutdata för att definiera hur värdena visas i en kolumn. Värdet måste vara'left'
,'center'
eller'right'
.formatstring
– Anger en formatsträng som definierar hur värdet formateras för utdata. Mer information om formatsträngar finns i Formattyper i .NET.width
– Anger den maximala breddkolumnen i en tabell när värdet visas. Värdet måste vara större än0
.depth
– ParameternFormat-Custom
Djup för anger expansionsdjupet för alla egenskaper. Meddepth
nyckeln kan du ange djupet för expansionen per egenskap.ascending
/descending
– Gör att du kan ange sorteringsordningen för en eller flera egenskaper. Det här är booleska värden.
Du behöver inte stava hashtabellnycklarna så länge det angivna namnprefixet är tvetydigt. Du kan till exempel använda n
i stället för Name
och e
i stället för Expression
.
Exempel
Compare-Object
Med beräknade egenskaper kan du styra hur egenskaperna för indataobjekten jämförs. I det här exemplet jämförs värdena i stället för att jämföra värdena direkt med resultatet av den aritmetiska åtgärden (modulus av 2).
Compare-Object @{p=1} @{p=2} -property @{ Expression = { $_.p % 2 } }
$_.p % 2 SideIndicator
---------- -------------
0 =>
1 <=
ConvertTo-Html
ConvertTo-Html
kan konvertera en samling objekt till en HTML-tabell.
Med beräknade egenskaper kan du styra hur tabellen visas.
Get-Alias |
ConvertTo-Html Name,
Definition,
@{
expr={$_.Parameters.Keys.Count}
align='center'
} |
Out-File .\aliases.htm -Force
Det här exemplet skapar en HTML-tabell som innehåller en lista över PowerShell-alias och talparametrarna för varje aliaskommando. Värdena för kolumnen ParameterCount är centrerade.
Format-Custom
Format-Custom
tillhandahåller en anpassad vy av ett objekt i ett format som liknar en klassdefinition. Mer komplexa objekt kan innehålla medlemmar som är djupt kapslade med komplexa typer. Parametern Format-Custom
Djup för anger expansionsdjupet för alla egenskaper. Med depth
nyckeln kan du ange djupet för expansionen per egenskap.
I det här exemplet depth
förenklar nyckeln anpassade utdata för cmdleten Get-Date
. Get-Date
returnerar ett DateTime-objekt . Egenskapen Date för det här objektet är också ett DateTime-objekt , så objektet är kapslat.
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
I det här exemplet använder vi beräknade egenskaper för att ändra namn och format för utdata från 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
I det här exemplet lägger den beräknade egenskapen till en typegenskap som används för att klassificera filerna efter innehållstyp.
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
Med Format-Wide
cmdleten kan du visa värdet för en egenskap för objekt i en samling som en lista med flera kolumner.
I det här exemplet vill vi se filnamnet och storleken (i kilobyte) som en bred lista. Eftersom Format-Wide
inte visar fler än en egenskap använder vi en beräknad egenskap för att kombinera värdet för två egenskaper till ett enda värde.
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
Cmdleten Group-Object
visar objekt i grupper baserat på värdet för en angiven egenskap. I det här exemplet räknar den beräknade egenskapen antalet filer för varje innehållstyp.
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
Select-Object
Du kan använda beräknade egenskaper för att lägga till ytterligare medlemmar i objektutdata med cmdleten Select-Object
. I det här exemplet visar vi de PowerShell-alias som börjar med bokstaven C
. Med hjälp av Select-Object
matar vi ut aliaset, den cmdlet som det mappas till och ett antal för antalet parametrar som definierats för cmdleten. Med hjälp av en beräknad egenskap kan vi skapa egenskapen 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
Med hjälp av de beräknade egenskaperna kan du sortera data i olika ordrar per egenskap. Det här exemplet sorterar data från en CSV-fil i stigande ordning efter Datum. Men inom varje datum sorteras raderna i fallande ordning efter 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
Kommentar
Du kan ange skriptblocket för uttrycket direkt, som ett argument, i stället för att ange det som
Expression
posten i en hashtable. Till exempel:'1', '10', '2' | Sort-Object { [int] $_ }
Det här exemplet är praktiskt för cmdletar som inte kräver (eller stöder) namngivning av en egenskap via
Name
nyckeln, till exempelSort-Object
,Group-Object
ochMeasure-Object
.För cmdletar som stöder namngivning av egenskapen konverteras skriptblocket till en sträng och används som namnet på egenskapen i utdata.
Expression
skriptblock körs i underordnade omfång, vilket innebär att anroparens variabler inte kan ändras direkt.Pipelinelogik tillämpas på utdata från
Expression
skriptblock. Det innebär att utdata från en matris med ett enda element gör att matrisen packas upp.För de flesta cmdletar ignoreras fel i uttrycksskriptblock i tysthet. För
Sort-Object
är instruktionsslutande och skriptslutfel utdata , men de avslutar inte -instruktionen.