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,
@{
name='ParameterCount'
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
Measure-Object;
Командлет Measure-Object
вычисляет числовые свойства объектов. В этом примере мы используем вычисляемое свойство для получения количества чисел от 1 до 10, которые равномерно различаются на 3.
Блок скрипта возвращается $true
, если число делится на 3 и $false
для всех остальных чисел. Операция Sum обрабатывает $true
значения как 1
и $false
значения 0
.
1..10 | Measure-Object -Property {($_ % 3) -eq 0} -Sum
Count : 10
Average :
Sum : 3
Maximum :
Minimum :
StandardDeviation :
Property : ($_ % 3) -eq 0
Примечание.
В отличие от других командлетов, Measure-Object
не принимает хэш-файл для вычисляемых свойств. Необходимо использовать блок скрипта.
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
, завершающие инструкции и завершающие скрипты ошибки являются выходными , но они не завершают инструкцию.
См. также
PowerShell