about_Calculated_Properties

Krótki opis

Program PowerShell umożliwia dynamiczne dodawanie nowych właściwości i zmienianie formatowania obiektów wyjściowych do potoku.

Długi opis

Kilka poleceń cmdlet programu PowerShell przekształca, grupuje lub przetwarza obiekty wejściowe w obiekty wyjściowe przy użyciu parametrów, które umożliwiają dodawanie nowych właściwości do tych obiektów wyjściowych. Tych parametrów można użyć do generowania nowych, obliczanych właściwości na obiektach wyjściowych na podstawie wartości obiektów wejściowych. Właściwość obliczeniowa jest definiowana przez tabelę skrótową zawierającą pary klucz-wartość, które określają nazwę nowej właściwości, wyrażenie do obliczenia wartości i opcjonalne informacje o formatowaniu.

Obsługiwane polecenia cmdlet

Następujące polecenia cmdlet obsługują wartości właściwości obliczeniowej dla parametru Właściwość . Polecenia Format-* cmdlet obsługują również wartości obliczeniowe dla parametru GroupBy .

Poniższa lista określa polecenia cmdlet obsługujące właściwości obliczeniowe i pary klucz-wartość obsługiwane przez każde polecenie cmdlet.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label — opcjonalne (dodane w programie PowerShell 6.x)
    • expression
    • width -Opcjonalne
    • alignment -Opcjonalne
  • Format-Custom

    • expression
    • depth -Opcjonalne
  • Format-List

    • name/label -Opcjonalne
    • expression
    • formatstring -Opcjonalne

    Ten sam zestaw par klucz-wartość ma również zastosowanie do wartości właściwości obliczeniowych przekazywanych do parametru GroupBy dla wszystkich Format-* poleceń cmdlet.

  • Format-Table

    • name/label -Opcjonalne
    • expression
    • formatstring -Opcjonalne
    • width -Opcjonalne
    • alignment -Opcjonalne
  • Format-Wide

    • expression
    • formatstring -Opcjonalne
  • Group-Object

    • expression
  • Measure-Object

    • Obsługuje tylko blok skryptu dla wyrażenia, a nie tabelę skrótu.
    • Nieobsługiwane w programie PowerShell 5.1 lub starszym.
  • Select-Object

    • name/label -Opcjonalne
    • expression
  • Sort-Object

    • expression
    • ascending/descending -Opcjonalne

Uwaga

Wartość expression elementu może być blokiem skryptu zamiast tabeli skrótu. Aby uzyskać więcej informacji, zobacz sekcję Uwagi .

Definicje kluczy tabeli skrótów

  • name/label - Określa nazwę tworzonej właściwości. Można użyć name lub jego aliasu, label, zamiennie.
  • expression - Ciąg lub blok skryptu używany do obliczania wartości nowej właściwości. expression Jeśli parametr jest ciągiem, wartość jest interpretowana jako nazwa właściwości obiektu wejściowego. Jest to krótsza opcja niż expression = { $_.<PropertyName> }.
  • alignment — Używane przez polecenia cmdlet, które generują tabelaryczne dane wyjściowe, aby zdefiniować sposób wyświetlania wartości w kolumnie. Wartość musi mieć 'left'wartość , 'center'lub 'right'.
  • formatstring - Określa ciąg formatu, który definiuje sposób formatowania wartości dla danych wyjściowych. Aby uzyskać więcej informacji na temat ciągów formatu, zobacz Format types in .NET (Typy formatów na platformie .NET).
  • width - Określa maksymalną szerokość kolumny w tabeli, gdy wartość jest wyświetlana. Wartość musi być większa niż 0.
  • depth- Parametr Format-Custom Głębokość określa głębokość rozszerzenia dla wszystkich właściwości. Klucz depth umożliwia określenie głębokości rozszerzenia dla właściwości.
  • ascending / descending — Umożliwia określenie kolejności sortowania dla co najmniej jednej właściwości. Są to wartości logiczne.

Nie musisz określać kluczy tabeli skrótu, o ile określony prefiks nazwy jest jednoznaczny. Można na przykład użyć n zamiast Name i e zamiast Expression.

Przykłady

Compare-Object

Za pomocą właściwości obliczeniowych można kontrolować sposób porównywania właściwości obiektów wejściowych. W tym przykładzie zamiast porównywać wartości bezpośrednio, wartości są porównywane z wynikiem operacji arytmetycznej (modulus 2).

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

ConvertTo-Html

ConvertTo-Html może przekonwertować kolekcję obiektów na tabelę HTML. Właściwości obliczeniowe umożliwiają kontrolowanie sposobu prezentowania tabeli.

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

W tym przykładzie jest tworzona tabela HTML zawierająca listę aliasów programu PowerShell i parametry liczbowe dla każdego aliasowanego polecenia. Wartości kolumny ParameterCount są wyśrodkowane.

Format-Custom

Format-Custom Udostępnia niestandardowy widok obiektu w formacie podobnym do definicji klasy. Bardziej złożone obiekty mogą zawierać elementy członkowskie, które są głęboko zagnieżdżone z typami złożonymi. Parametr Głębokość parametru Format-Custom określa głębokość rozszerzenia dla wszystkich właściwości. Klucz depth umożliwia określenie głębokości rozszerzenia dla właściwości.

W tym przykładzie depth klucz upraszcza niestandardowe dane wyjściowe polecenia Get-Date cmdlet. Get-Datezwraca obiekt DateTime. Właściwość Date tego obiektu jest również obiektem DateTime , więc obiekt jest zagnieżdżony.

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

W tym przykładzie użyjemy właściwości obliczeniowych, aby zmienić nazwę i format danych wyjściowych 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

W tym przykładzie właściwość obliczeniowa dodaje właściwość Type służącą do klasyfikowania plików według typu zawartości.

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

Polecenie Format-Wide cmdlet umożliwia wyświetlanie wartości jednej właściwości dla obiektów w kolekcji jako listy z wieloma kolumnami.

W tym przykładzie chcemy zobaczyć nazwę pliku i rozmiar (w kilobajtach) jako szeroką listę. Ponieważ Format-Wide nie wyświetla więcej niż jednej właściwości, używamy właściwości obliczeniowej, aby połączyć wartość dwóch właściwości w jedną wartość.

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

Polecenie Group-Object cmdlet wyświetla obiekty w grupach na podstawie wartości określonej właściwości. W tym przykładzie właściwość obliczeniowa zlicza liczbę plików każdego typu zawartości.

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

Polecenie Measure-Object cmdlet oblicza właściwości liczbowe obiektów. W tym przykładzie używamy właściwości obliczeniowej, aby uzyskać liczbę (Sum) liczb z zakresu od 1 do 10, które są równomiernie podzielne przez 3.

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

Uwaga

W przeciwieństwie do innych poleceń cmdlet, Measure-Object nie akceptuje tabeli skrótu dla właściwości obliczeniowych. Należy użyć bloku skryptu.

Select-Object

Możesz użyć właściwości obliczeniowych, aby dodać dodatkowe elementy członkowskie do danych wyjściowych obiektów za Select-Object pomocą polecenia cmdlet . W tym przykładzie wyświetlamy aliasy programu PowerShell rozpoczynające się literą C. Przy użyciu polecenia Select-Objectzwracamy alias, polecenie cmdlet, do których jest mapowane, oraz liczbę parametrów zdefiniowanych dla polecenia cmdlet. Za pomocą właściwości obliczeniowej możemy utworzyć właściwość 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

Za pomocą właściwości obliczeniowych można sortować dane w różnych zamówieniach na właściwość. W tym przykładzie dane są sortowane z pliku CSV w kolejności rosnącej według daty. Jednak w każdej dacie wiersze są sortowane w kolejności malejącej według wartości 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

Uwagi

  • Blok skryptu wyrażenia można określić bezpośrednio jako argument, zamiast określać go jako Expression wpis w tabeli skrótu. Na przykład:

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

    Ten przykład jest wygodny w przypadku poleceń cmdlet, które nie wymagają (lub obsługi) nazewnictwa właściwości za pośrednictwem Name klucza, takiego jak Sort-Object, Group-Objecti Measure-Object.

    W przypadku poleceń cmdlet obsługujących nazewnictwo właściwości blok skryptu jest konwertowany na ciąg i używany jako nazwa właściwości w danych wyjściowych.

  • Expression bloki skryptu są uruchamiane w zakresach podrzędnych , co oznacza, że zmienne obiektu wywołującego nie mogą być modyfikowane bezpośrednio.

  • Logika potoku jest stosowana do danych wyjściowych z Expression bloków skryptu. Oznacza to, że wyprowadzanie tablicy z jednym elementem powoduje, że tablica zostanie rozpasana.

  • W przypadku większości poleceń cmdlet błędy wewnątrz bloków skryptów wyrażeń są po cichu ignorowane. W przypadku Sort-Objectinstrukcji błędy zakończenia instrukcji i zakończenia skryptu są danymi wyjściowymi , ale nie kończą instrukcji .

Zobacz też