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


about_Calculated_Properties

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

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

Подробное описание

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

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

Следующие командлеты поддерживают вычисляемые значения свойств для параметра 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 вместо Expression.e Name

Примеры

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

См. также