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 parametern Property. Cmdletarna Format-*
stöder även 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 (tillagt i PowerShell 6.x) Expression
-
Width
– valfritt -
Alignment
– valfritt
-
Format-Custom
Expression
-
Depth
– valfritt
Format-List
-
Name
/Label
– valfritt Expression
-
FormatString
– valfritt
Samma uppsättning nyckel/värde-par gäller även för beräknade egenskapsvärden som skickas till parametern GroupBy för alla
Format-*
cmdletar.-
Format-Table
-
Name
/Label
– valfritt Expression
-
FormatString
– valfritt -
Width
– valfritt -
Alignment
– valfritt
-
Format-Wide
Expression
-
FormatString
– valfritt
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
– valfritt Expression
-
Sort-Object
Expression
-
Ascending
/Descending
– valfritt
Not
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
, omväxlande. -
Expression
– ett sträng- eller skriptblock som används för att beräkna värdet för den nya egenskapen. OmExpression
är en sträng tolkas värdet som ett egenskapsnamn för 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
– parametern Depth förFormat-Custom
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,
@{
Name='ParameterCount'
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
ger 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 Depth för Format-Custom
anger expansionsdjupet för alla egenskaper. Med Depth
-nyckeln kan du ange djupet för expansionen per egenskap.
I det här exemplet förenklar Depth
-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 egenskap typ 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 cmdleten Format-Wide
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
Measure-Object
Cmdleten Measure-Object
beräknar de numeriska egenskaperna för objekt. I det här exemplet använder vi en beräknad egenskap för att få antalet tal mellan 1 och 10 som är jämnt delbara med 3.
Skriptblocket returnerar $true
om talet är delbart med 3 och $false
för alla andra tal. Åtgärden Sum behandlar $true
värden som 1
och $false
värden som 0
.
1..10 | Measure-Object -Property {($_ % 3) -eq 0} -Sum
Count : 10
Average :
Sum : 3
Maximum :
Minimum :
StandardDeviation :
Property : ($_ % 3) -eq 0
Not
Till skillnad från de andra cmdletarna accepterar Measure-Object
inte en hashtable för beräknade egenskaper. Du måste använda ett skriptblock.
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, cmdleten 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. I det här exemplet sorteras 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
Anteckningar
Du kan ange skriptblocket för uttryck direkt, som ett argument, i stället för att ange det som
Expression
post 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.