about_Calculated_Properties

Deskripsi singkat

PowerShell menyediakan kemampuan untuk menambahkan properti baru secara dinamis dan mengubah pemformatan output objek ke alur.

Deskripsi panjang

Beberapa cmdlet PowerShell mengubah, mengelompokkan, atau memproses objek input menjadi objek output menggunakan parameter yang memungkinkan penambahan properti baru ke objek output tersebut. Anda dapat menggunakan parameter ini untuk menghasilkan properti baru yang dihitung pada objek output berdasarkan nilai objek input. Properti terhitung ditentukan oleh hashtable yang berisi pasangan kunci-nilai yang menentukan nama properti baru, ekspresi untuk menghitung nilai, dan informasi pemformatan opsional.

Cmdlet yang didukung

Cmdlet berikut mendukung nilai properti terhitung untuk parameter Properti . Format-* Cmdlet juga mendukung nilai terhitung untuk parameter GroupBy.

Daftar berikut menguraikan cmdlet yang mendukung properti terhitung dan pasangan kunci-nilai yang didukung setiap cmdlet.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label - opsional (ditambahkan di PowerShell 6.x)
    • expression
    • width -Opsional
    • alignment -Opsional
  • Format-Custom

    • expression
    • depth -Opsional
  • Format-List

    • name/label -Opsional
    • expression
    • formatstring -Opsional

    Set pasangan kunci-nilai yang sama ini juga berlaku untuk nilai properti terhitung yang diteruskan ke parameter GroupBy untuk semua Format-* cmdlet.

  • Format-Table

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

    • expression
    • formatstring -Opsional
  • Group-Object

    • expression
  • Measure-Object

    • Hanya mendukung blok skrip untuk ekspresi, bukan hashtable.
    • Tidak didukung di PowerShell 5.1 dan yang lebih lama.
  • Select-Object

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

    • expression
    • ascending/descending -Opsional

Catatan

Nilai expression dapat menjadi blok skrip alih-alih hashtable. Untuk informasi selengkapnya, lihat bagian Catatan.

Definisi kunci hashtable

  • name/label - Menentukan nama properti yang sedang dibuat. Anda dapat menggunakan name atau aliasnya, label, secara bergantian.
  • expression - String atau blok skrip yang digunakan untuk menghitung nilai properti baru. expression Jika adalah string, nilai ditafsirkan sebagai nama properti pada objek input. Ini adalah opsi yang lebih pendek daripada expression = { $_.<PropertyName> }.
  • alignment - Digunakan oleh cmdlet yang menghasilkan output tabular untuk menentukan bagaimana nilai ditampilkan dalam kolom. Nilainya harus 'left', 'center', atau 'right'.
  • formatstring - Menentukan string format yang menentukan bagaimana nilai diformat untuk output. Untuk informasi selengkapnya tentang string format, lihat Jenis format di .NET.
  • width - Menentukan kolom lebar maksimum dalam tabel saat nilai ditampilkan. Nilai harus lebih besar dari 0.
  • depth - Parameter KedalamanFormat-Custom menentukan kedalaman ekspansi untuk semua properti. Kunci memungkinkan depth Anda menentukan kedalaman ekspansi per properti.
  • ascending / descending - Memungkinkan Anda menentukan urutan pengurutan untuk satu atau beberapa properti. Ini adalah nilai boolean.

Anda tidak perlu mengeja kunci yang dapat di-hash selama awalan nama yang ditentukan tidak ambigu. Misalnya, Anda dapat menggunakan n alih-alih Name dan e bukan Expression.

Contoh

Compare-Object

Dengan properti terhitung, Anda dapat mengontrol bagaimana properti objek input dibandingkan. Dalam contoh ini, daripada membandingkan nilai secara langsung, nilai dibandingkan dengan hasil operasi aritmatika (modulus 2).

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

ConvertTo-Html

ConvertTo-Html dapat mengonversi kumpulan objek ke tabel HTML. Properti terhitung memungkinkan Anda mengontrol bagaimana tabel disajikan.

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

Contoh ini membuat tabel HTML yang berisi daftar alias PowerShell dan parameter angka untuk setiap perintah alias. Nilai kolom ParameterCount dipusatkan.

Format-Custom

Format-Custom menyediakan tampilan kustom objek dalam format yang mirip dengan definisi kelas. Objek yang lebih kompleks dapat berisi anggota yang sangat bersarang dengan jenis kompleks. Parameter KedalamanFormat-Custom menentukan kedalaman ekspansi untuk semua properti. Kunci memungkinkan depth Anda menentukan kedalaman ekspansi per properti.

Dalam contoh ini, kunci depth menyederhanakan output kustom untuk Get-Date cmdlet. Get-Datemengembalikan objek DateTime. Properti Tanggal objek ini juga merupakan objek DateTime , sehingga objek disarangkan.

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

Dalam contoh ini, kami menggunakan properti terhitung untuk mengubah nama dan format output dari 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

Dalam contoh ini, properti terhitung menambahkan properti Jenis yang digunakan untuk mengklasifikasikan file menurut jenis konten.

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 Cmdlet memungkinkan Anda menampilkan nilai satu properti untuk objek dalam koleksi sebagai daftar multi-kolom.

Untuk contoh ini, kita ingin melihat nama file dan ukuran (dalam kilobyte) sebagai daftar yang luas. Karena Format-Wide tidak menampilkan lebih dari satu properti, kami menggunakan properti terhitung untuk menggabungkan nilai dua properti ke dalam satu nilai.

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 Cmdlet menampilkan objek dalam grup berdasarkan nilai properti tertentu. Dalam contoh ini, properti terhitung menghitung jumlah file dari setiap jenis konten.

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 Cmdlet menghitung properti numerik objek. Dalam contoh ini, kita menggunakan properti terhitung untuk mendapatkan jumlah (Jumlah) angka, antara 1 dan 10, yang dibagi secara merata dengan 3.

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

Catatan

Tidak seperti cmdlet lainnya, Measure-Object tidak menerima hashtable untuk properti terhitung. Anda harus menggunakan blok skrip.

Select-Object

Anda dapat menggunakan properti terhitung untuk menambahkan anggota tambahan ke output objek dengan Select-Object cmdlet. Dalam contoh ini, kami mencantumkan alias PowerShell yang dimulai dengan huruf C. Menggunakan Select-Object, kami mengeluarkan alias, cmdlet yang dipetakan, dan hitungan untuk jumlah parameter yang ditentukan untuk cmdlet. Dengan menggunakan properti terhitung, kita dapat membuat properti 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

Dengan menggunakan properti terhitung, Anda dapat mengurutkan data dalam urutan yang berbeda per properti. Contoh ini mengurutkan data dari file CSV dalam urutan naik menurut Tanggal. Tetapi dalam setiap tanggal, ia mengurutkan baris dalam urutan menurun menurut UnitSold.

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

Catatan

  • Anda dapat menentukan blok skrip ekspresi secara langsung, sebagai argumen, daripada menentukannya sebagai Expression entri dalam hashtable. Contohnya:

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

    Contoh ini nyaman untuk cmdlet yang tidak memerlukan (atau dukungan) penamaan properti melalui Name kunci, seperti Sort-Object, Group-Object, dan Measure-Object.

    Untuk cmdlet yang mendukung penamaan properti, blok skrip dikonversi ke string dan digunakan sebagai nama properti dalam output.

  • Expression Blok skrip berjalan dalam cakupan anak , yang berarti bahwa variabel pemanggil tidak dapat dimodifikasi secara langsung.

  • Logika alur diterapkan ke output dari Expression blok skrip. Ini berarti bahwa menghasilkan array elemen tunggal menyebabkan array tersebut dibongkar.

  • Untuk sebagian besar cmdlet, kesalahan di dalam blok skrip ekspresi diabaikan dengan diam-diam. Untuk Sort-Objectkesalahan , penghentian pernyataan dan penghentian skrip adalah output tetapi tidak mengakhiri pernyataan.

Lihat juga