about_Calculated_Properties

Krátký popis

PowerShell umožňuje dynamicky přidávat nové vlastnosti a měnit formátování výstupu objektů do kanálu.

Dlouhý popis

Několik rutin PowerShellu transformuje, seskupuje nebo zpracovává vstupní objekty na výstupní objekty pomocí parametrů, které umožňují přidání nových vlastností do těchto výstupních objektů. Pomocí těchto parametrů můžete vygenerovat nové počítané vlastnosti pro výstupní objekty na základě hodnot vstupních objektů. Počítaná vlastnost je definována hashtable obsahující páry klíč-hodnota, které určují název nové vlastnosti, výraz pro výpočet hodnoty a volitelné informace o formátování.

Podporované rutiny

Následující rutiny podporují počítané hodnoty vlastností pro parametr Property . Rutiny Format-* také podporují počítané hodnoty pro parametr GroupBy .

Následující seznam uvádí rutiny, které podporují počítané vlastnosti a páry klíč-hodnota, které každá rutina podporuje.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label – volitelné (přidáno v PowerShellu 6.x)
    • expression
    • width -volitelný
    • alignment -volitelný
  • Format-Custom

    • expression
    • depth -volitelný
  • Format-List

    • name/label -volitelný
    • expression
    • formatstring -volitelný

    Stejná sada párů klíč-hodnota platí také pro počítané hodnoty vlastností předané parametru GroupBy pro všechny Format-* rutiny.

  • Format-Table

    • name/label -volitelný
    • expression
    • formatstring -volitelný
    • width -volitelný
    • alignment -volitelný
  • Format-Wide

    • expression
    • formatstring -volitelný
  • Group-Object

    • expression
  • Measure-Object

    • Podporuje pouze blok skriptu pro výraz, nikoli hashtable.
    • PowerShell 5.1 a starší nepodporuje.
  • Select-Object

    • name/label -volitelný
    • expression
  • Sort-Object

    • expression
    • ascending/descending -volitelný

Poznámka:

Hodnota expression může být blok skriptu místo hashtable. Další informace najdete v části Poznámky .

Definice klíče hashovací tabulky

  • name/label - Určuje název vytvářené vlastnosti. Můžete použít name nebo jeho alias , labelzaměnitelně.
  • expression – Blok řetězce nebo skriptu sloužící k výpočtu hodnoty nové vlastnosti. expression Pokud je řetězec, hodnota je interpretována jako název vlastnosti vstupního objektu. Jedná se o kratší možnost než expression = { $_.<PropertyName> }.
  • alignment – Používá se rutinami, které vytvářejí tabulkový výstup k definování způsobu zobrazení hodnot ve sloupci. Hodnota musí být 'left', 'center'nebo 'right'.
  • formatstring – Určuje formátovací řetězec, který definuje, jak je hodnota formátována pro výstup. Další informace o formátovací řetězce naleznete v tématu Typy formátů v .NET.
  • width – Určuje sloupec maximální šířky v tabulce při zobrazení hodnoty. Hodnota musí být větší než 0.
  • depth- Parametr Format-Custom Hloubka určuje hloubku rozšíření pro všechny vlastnosti. Klíč depth umožňuje zadat hloubku rozšíření na vlastnost.
  • ascending / descending – Umožňuje zadat pořadí řazení pro jednu nebo více vlastností. Jedná se o logické hodnoty.

Klíče hashovací tabulky není nutné vypsat, pokud je zadaná předpona názvu jednoznačná. Můžete například použít n místo Name a e místo Expression.

Příklady

Compare-Object

S počítanými vlastnostmi můžete řídit, jak se vlastnosti vstupních objektů porovnávají. V tomto příkladu se hodnoty místo přímého porovnání hodnot porovnávají s výsledkem aritmetické operace (moduly 2).

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

ConvertTo-Html

ConvertTo-Html může převést kolekci objektů na tabulku HTML. Počítané vlastnosti umožňují řídit, jak se tabulka prezentuje.

Get-Alias |
  ConvertTo-Html Name,
                 Definition,
                 @{
                    name='ParameterCount'
                    expr={$_.Parameters.Keys.Count}
                    align='center'
                 } |
    Out-File .\aliases.htm -Force

Tento příklad vytvoří tabulku HTML obsahující seznam aliasů PowerShellu a číselných parametrů pro každý příkaz aliasu. Hodnoty sloupce ParameterCount jsou za středem.

Format-Custom

Format-Custom poskytuje vlastní zobrazení objektu ve formátu podobném definici třídy. Složitější objekty můžou obsahovat členy, které jsou hluboce vnořené se složitými typy. Parametr Format-Custom Hloubka určuje hloubku rozšíření pro všechny vlastnosti. Klíč depth umožňuje zadat hloubku rozšíření na vlastnost.

V tomto příkladu depth klíč zjednodušuje vlastní výstup rutiny Get-Date . Get-Datevrátí objekt DateTime. Vlastnost Date tohoto objektu je také Objekt DateTime , takže objekt je vnořený.

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

V tomto příkladu používáme počítané vlastnosti ke změně názvu a formátu výstupu z 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

V tomto příkladu počítaná vlastnost přidá vlastnost Type sloužící ke klasifikaci souborů podle typu obsahu.

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

Rutina Format-Wide umožňuje zobrazit hodnotu jedné vlastnosti pro objekty v kolekci jako seznam s více sloupci.

V tomto příkladu chceme zobrazit název souboru a velikost (v kilobajtech) jako široký výpis. Vzhledem k tomu Format-Wide , že nezobrazuje více než jednu vlastnost, používáme počítanou vlastnost ke sloučení hodnoty dvou vlastností do jedné hodnoty.

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

Rutina Group-Object zobrazí objekty ve skupinách na základě hodnoty zadané vlastnosti. V tomto příkladu počítaná vlastnost spočítá počet souborů každého typu obsahu.

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

Rutina Measure-Object vypočítá číselné vlastnosti objektů. V tomto příkladu použijeme počítanou vlastnost k získání počtu čísel mezi 1 a 10, které jsou rovnoměrně dělitelné o 3.

Blok skriptu se vrátí $true , pokud je číslo dělitelné číslem 3 a $false pro všechna ostatní čísla. Operace Sum považuje $true hodnoty za hodnoty a 1 $false hodnoty jako 0.

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

Poznámka:

Na rozdíl od ostatních rutin Measure-Object nepřijímá hashovací tabulku pro počítané vlastnosti. Musíte použít blok skriptu.

Select-Object

Počítané vlastnosti můžete použít k přidání dalších členů do výstupu objektů pomocí rutiny Select-Object . V tomto příkladu uvádíme aliasy PowerShellu, které začínají písmenem C. Pomocí Select-Object, vypíšeme alias, rutinu, na které je namapovaná, a počet parametrů definovaných pro rutinu. Pomocí počítané vlastnosti můžeme vytvořit vlastnost 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

Pomocí počítaných vlastností můžete řadit data v různých objednávkách na vlastnost. Tento příklad seřadí data ze souboru CSV ve vzestupném pořadí podle data. V každém datu ale seřadí řádky sestupně podle 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

Notes

  • Blok skriptu výrazu můžete zadat přímo jako argument, místo abyste ho zadali jako Expression položku v hashovatelné tabulce. Příklad:

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

    Tento příklad je vhodný pro rutiny, které nevyžadují (nebo podporují) pojmenování vlastnosti prostřednictvím Name klíče, například Sort-Object, Group-Objecta Measure-Object.

    U rutin, které podporují pojmenování vlastnosti, se blok skriptu převede na řetězec a použije se jako název vlastnosti ve výstupu.

  • Expression Bloky skriptu se spouští v podřízených oborech, což znamená, že proměnné volajícího nelze přímo upravit.

  • Logika kanálu se použije na výstup z Expression bloků skriptu. To znamená, že výstup pole s jedním prvkem způsobí, že pole se rozbalí.

  • U většiny rutin se chyby uvnitř bloků skriptu výrazů tiše ignorují. V případě Sort-Objectchyb ukončování příkazů a ukončování skriptů jsou výstupem , ale neukončují příkaz.

Viz také