Поделиться через


about_Calculated_Properties

Краткое описание

PowerShell позволяет динамически добавлять новые свойства и изменять форматирование выходных данных объектов в конвейер.

Длинное описание

Несколько командлетов PowerShell преобразуют, группировать или обрабатывать входные объекты в выходные объекты с помощью параметров, позволяющих создавать новые свойства для этих выходных объектов. Эти параметры можно использовать для создания новых вычисляемых свойств на выходных объектах на основе значений входных объектов. Входной объект можно получить с помощью $_ или $PSItem автоматической переменной в элементе Expression вычисляемого свойства.

Вычисляемое свойство определяется как хэш-файл , содержащий пары "ключ-значение", указывающие значение только что вычисляемого свойства. Некоторые команды поддерживают другие пары "ключ-значение", которые управляют отображением свойства в выходных данных.

Поддерживаемые командлеты

Следующие командлеты поддерживают вычисляемые значения свойств для параметра Property . Командлеты Format-* также поддерживают вычисляемые значения для параметра GroupBy .

Следующий элемент списка содержит командлеты, поддерживающие вычисляемые свойства и пары "ключ-значение", поддерживаемые каждым командлетом.

  • Compare-Object

    • Expression
  • ConvertTo-Html

    • Name / Label — необязательно (добавлено в PowerShell 6.x)
    • Expression
    • Width -необязательный
    • Alignment -необязательный
  • Format-Custom

    • Expression
    • Depth -необязательный
  • Format-List

    • Name / Label -необязательный
    • Expression
    • FormatString -необязательный

    Этот же набор пар "ключ-значение" также применяется к вычисляемым значениям свойств, передаваемым параметру GroupBy для всех Format-* командлетов.

  • Format-Table

    • Name / Label -необязательный
    • Expression
    • FormatString -необязательный
    • Width -необязательный
    • Alignment -необязательный
  • Format-Wide

    • Expression
    • FormatString -необязательный
  • Group-Object

    • Expression
  • Measure-Object

    • Поддерживается только блок скрипта для выражения, а не хэш-файл.
    • Не поддерживается в PowerShell 5.1 и более ранних версиях.
  • Select-Object

    • Name / Label -необязательный
    • Expression
  • Sort-Object

    • Expression
    • Ascending / Descending -необязательный

Примечание.

Значение Expression может быть блоком скрипта, а не хэш-файлом. Дополнительные сведения см. в разделе Примечания.

Определения ключей хэш-таблицы

  • Name / Label — указывает имя создаваемого свойства. Можно использовать Name или его псевдоним, Labelвзаимозаменяемо.
  • Expression — строка или блок скрипта, используемый для вычисления значения нового свойства. Expression Если строка является строкой, значение интерпретируется как имя свойства в входном объекте. Это более короткий вариант, чем Expression = { $_.<PropertyName> }.
  • Alignment — используется командлетами, которые создают табличные выходные данные, чтобы определить, как значения отображаются в столбце. Значение должно быть равно 'Left', 'Center' или 'Right'.
  • FormatString — задает строку формата, которая определяет форматирование значения для выходных данных. Дополнительные сведения о строках форматирования см. в разделе "Типы форматов" в .NET.
  • Width — указывает максимальный столбец ширины таблицы при отображении значения. Значение должно быть больше 0.
  • Depth — Параметр ГлубиныFormat-Custom определяет глубину расширения для всех свойств. Ключ Depth позволяет указать глубину расширения для каждого свойства.
  • Ascending / Descending — Позволяет указать порядок сортировки для одного или нескольких свойств. Это логические значения.

Вам не нужно указывать хэш-ключи, если указанный префикс имени является однозначной. Например, вместо этого можно использовать n вместо Name.eExpression

Примеры

Compare-Object

С помощью вычисляемых свойств можно управлять сравнением свойств входных объектов. В этом примере вместо сравнения значений напрямую значения сравниваются с результатом арифметической операции (модулы 2).

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

ConvertTo-Html

ConvertTo-Html может преобразовать коллекцию объектов в html-таблицу. Вычисляемые свойства позволяют управлять представлением таблицы.

Get-Alias |
  ConvertTo-Html Name,
                 Definition,
                 @{
                    Expr={$_.Parameters.Keys.Count}
                    Align='Center'
                 } |
    Out-File .\aliases.htm -Force

В этом примере создается html-таблица, содержащая список псевдонимов PowerShell и параметры числа для каждой команды с псевдонимами. Значения столбца ParameterCount центрируются.

Format-Custom

Format-Custom предоставляет пользовательское представление объекта в формате, аналогичном определению класса. Более сложные объекты могут содержать элементы, глубоко вложенные с помощью сложных типов. Параметр указывает глубину расширения для всех свойств. Ключ Depth позволяет указать глубину расширения для каждого свойства.

В этом примере Depth ключ упрощает пользовательские выходные данные для командлета Get-Date . Get-Date возвращает объект DateTime. Свойство Date этого объекта также является объектом DateTime, поэтому объект вложен.

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

В этом примере мы используем вычисляемые свойства для изменения имени и формата выходных данных 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

В этом примере вычисляемое свойство добавляет свойство Type , используемое для классификации файлов по типу контента.

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

Командлет Format-Wide позволяет отображать значение одного свойства для объектов в коллекции в виде списка с несколькими столбцами.

В этом примере мы хотим увидеть имя файла и размер (в килобайтах) в виде широкого списка. Так как Format-Wide не отображается несколько свойств, мы используем вычисляемое свойство для объединения значения двух свойств в одно значение.

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

Командлет Group-Object отображает объекты в группах на основе значения указанного свойства. В этом примере вычисляемое свойство подсчитывает количество файлов каждого типа контента.

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

Вы можете использовать вычисляемые свойства для добавления дополнительных элементов в выходные данные объектов с помощью командлета Select-Object . В этом примере мы перечисляем псевдонимы PowerShell, начинающиеся с буквы C. Используя Select-Object, мы выводим псевдоним, командлет, сопоставленный с, и число параметров, определенных для командлета. С помощью вычисляемого свойства можно создать свойство 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

С помощью вычисляемых свойств можно сортировать данные в разных заказах на свойство. В этом примере данные сортируются из CSV-файла в порядке возрастания по дате. Но в течение каждой даты он сортирует строки в порядке убывания по 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

Примечания.

  • Вы можете напрямую указать блок скрипта выражения в качестве аргумента, а не указывать его как Expression запись в хэш-файле. Например:

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

    Этот пример удобно для командлетов, которые не требуют (или поддержки) именования свойства с помощью Name ключа, например Sort-Object, Group-Objectи Measure-Object.

    Для командлетов, поддерживающих именование свойства, блок скрипта преобразуется в строку и используется в качестве имени свойства в выходных данных.

  • Expression скриптблоки выполняются в дочерних областях, что означает, что переменные вызывающего объекта не могут быть напрямую изменены.

  • Логика конвейера применяется к выходным данным из Expression скриптов. Это означает, что вывод массива с одним элементом приводит к тому, что массив распакуется.

  • Для большинства командлетов ошибки внутри скриптов выражений тихо игнорируются. Для Sort-Object, завершающие инструкции и завершающие скрипты ошибки являются выходными , но они не завершают инструкцию.

См. также