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
-オプション
この同じキーと値のペアのセットは、すべての
Format-*
コマンドレットの GroupBy パラメーターに渡される計算プロパティ値にも適用されます。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
-オプション
Note
値には、 expression
ハッシュテーブルではなくスクリプト ブロックを指定できます。 詳細については、「メモ」セクションを参照してください。
ハッシュテーブル キーの定義
name
/label
- 作成するプロパティの名前を指定します。 別名または別名label
を同じ意味で使用name
できます。expression
- 新しいプロパティの値を計算するために使用される文字列またはスクリプト ブロック。 文字列のexpression
場合、値は入力オブジェクトのプロパティ名として解釈されます。 これはより短いオプションexpression = { $_.<PropertyName> }
です.alignment
- 列に値を表示する方法を定義するために、表形式の出力を生成するコマンドレットによって使用されます。 値は'left'
、'center'
、または'right'
である必要があります。formatstring
- 出力の値の書式設定方法を定義する書式指定文字列を指定します。 書式指定文字列の詳細については、「.NET の書式指定型」を参照してください。width
- 値が表示されるときのテーブルの最大幅列を指定します。 値は次の値より0
大きくする必要があります。depth
- Depth パラメーターFormat-Custom
は、すべてのプロパティの展開の深さを指定します。 キーdepth
を使用すると、プロパティごとの拡張の深さを指定できます。ascending
/descending
- 1 つ以上のプロパティの並べ替え順序を指定できます。 これらはブール値です。
指定された名前プレフィックスが明確である限り、ハッシュテーブル キーをスペル アウトする必要はありません。 たとえば、次の代わりにName
使用n
e
Expression
できます。
例
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
この例では、PowerShell エイリアスの一覧と、エイリアス化された各コマンドの数値パラメーターを含む HTML テーブルを作成します。 ParameterCount 列の値は中央揃えです。
Format-Custom
Format-Custom
は、クラス定義と同様の形式でオブジェクトのカスタム ビューを提供します。 より複雑なオブジェクトには、複合型で深く入れ子になっているメンバーを含めることができます。 Depth パラメーター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
コマンドレットを使用すると、コレクション内のオブジェクトの 1 つのプロパティの値を複数列リストとして表示できます。
この例では、ファイル名とサイズ (KB 単位) をワイド リストとして表示します。 複数のプロパティが表示されないため Format-Wide
、計算プロパティを使用して、2 つのプロパティの値を 1 つの値に結合します。
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 で均等に割り切ることができます。
1..10 | Measure-Object -Property {($_ % 3) -eq 0} -Sum
Count : 10
Average :
Sum : 3
Maximum :
Minimum :
StandardDeviation :
Property : ($_ % 3) -eq 0
Note
他のコマンドレットとは異なり、 Measure-Object
計算プロパティのハッシュテーブルは受け入れられません。 スクリプト ブロックを使用する必要があります。
Select-Object
計算プロパティを使用して、コマンドレットを使用してオブジェクト出力にメンバーを Select-Object
追加できます。 この例では、文字 C
で始まる PowerShell エイリアスを一覧表示します。 を使用して 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
プロパティに名前を付ける (またはサポートする) 必要のないコマンドレットに便利です 。.Group-Object
Sort-Object
Measure-Object
.プロパティの名前付けをサポートするコマンドレットの場合、スクリプト ブロックは文字列に変換され、出力内のプロパティの名前として使用されます。
Expression
スクリプト ブロックは子スコープで実行されます。つまり、呼び出し元の変数を直接変更することはできません。パイプライン ロジックは、スクリプト ブロックからの
Expression
出力に適用されます。 つまり、単一要素配列を出力すると、その配列がラップ解除されます。ほとんどのコマンドレットでは、式スクリプト ブロック内のエラーは静かに無視されます。 の場合
Sort-Object
、ステートメント終了エラーとスクリプト終了エラーは出力されますが、ステートメントは終了しません。
関連項目
PowerShell