Hesaplanan Özellikler hakkında


Kısa açıklama

PowerShell, dinamik olarak yeni özellikler ekleme ve nesnelerin çıktısının ardışık düzene biçimlendirmesini değiştirme olanağı sağlar.

Uzun açıklama

Birkaç PowerShell cmdlet'i, giriş nesnelerini, bu çıkış nesnelerine yeni özelliklerin eklenmesine izin veren parametreleri kullanarak çıkış nesnelerine dönüştürür, gruplandırır veya işler. Giriş nesnelerinin değerlerine dayalı olarak çıktı nesnelerinde yeni, hesaplanmış özellikler oluşturmak için bu parametreleri kullanabilirsiniz. Hesaplanan özellik, yeni özelliğin adını belirten anahtar/değer çiftlerini, değeri hesaplamak için bir ifadeyi ve isteğe bağlı biçimlendirme bilgilerini içeren bir karma tablosuyla tanımlanır.

Desteklenen cmdlet'ler

Aşağıdaki cmdlet'ler Property parametresi için hesaplanan özellik değerlerini destekler. Format-* cmdlet'leri ayrıca GroupBy parametresi için hesaplanan değerleri de destekler.

Aşağıdaki liste, hesaplanan özellikleri destekleyen cmdlet'leri ve her cmdlet'in desteklediği anahtar/değer çiftlerini listeler.

  • Nesneyi Karşılaştır

      expression
  • Html'ye Dönüştür

    • ad/etiket - isteğe bağlı (PowerShell 6.x'te eklenmiştir)
    • expression
    • genişlik - isteğe bağlı
    • hizalama - isteğe bağlı
  • Biçim-Özel

      expression
    • derinlik - isteğe bağlı
  • Biçim Listesi

    • ad/etiket - isteğe bağlı
    • expression
    • formatstring - isteğe bağlı

    Aynı anahtar/değer çiftleri kümesi, tüm Format-* cmdlet'leri için GroupBy parametresine iletilen hesaplanmış özellik değerleri için de geçerlidir.

  • Biçim Tablosu

    • ad/etiket - isteğe bağlı
    • expression
    • formatstring - isteğe bağlı
    • genişlik - isteğe bağlı
    • hizalama - isteğe bağlı
  • Biçim Genelinde

      expression
    • formatstring - isteğe bağlı
  • Grup-Nesne

      expression
  • Ölçü Nesnesi

    • Bir karma tablosunu değil, yalnızca ifade için bir komut dosyası bloğunu destekler.
    • PowerShell 5,1 ve daha eski sürümlerde desteklenmez.
  • Nesne Seç

    • ad/etiket - isteğe bağlı
    • expression
  • Nesneyi Sırala

      expression
    • artan/azalan - isteğe bağlı

Not

ifade'nin değeri karma tablosu yerine bir komut dosyası bloğu olabilir. Daha fazla bilgi için Notlar bölümüne bakın.

Hashtable anahtar tanımları

  • ad/etiket - Oluşturulmakta olan özelliğin adını belirtir. name veya onun takma adı olan label'ı birbirinin yerine kullanabilirsiniz.
  • ifade - Yeni özelliğin değerini hesaplamak için kullanılan bir dize veya komut dosyası bloğu. ifade bir dize ise değer, giriş nesnesindeki bir özellik adı olarak yorumlanır. Bu, expression={ $_. seçeneğinden daha kısa bir seçenektir.
  • hizalama - Değerlerin bir sütunda nasıl görüntüleneceğini tanımlamak için tablo halinde çıktı üreten cmdlet'ler tarafından kullanılır. Değer 'left', 'center' veya 'right' olmalıdır.
  • formatstring - Değerin çıktı için nasıl biçimlendirileceğini tanımlayan bir biçim dizesini belirtir. Biçim dizeleri hakkında daha fazla bilgi için bkz. .NET'te biçim türleri.
  • width - Değer görüntülendiğinde tablodaki maksimum genişlik sütununu belirtir. Değer 0'dan büyük olmalıdır.
  • derinlik - Format-Custom'un Derinlik parametresi, tüm özellikler için genişletme derinliğini belirtir. derinlik tuşu, özellik başına genişletme derinliğini belirtmenize olanak tanır.
  • artan/azalan - Bir veya daha fazla özellik için sıralama sırasını belirtmenize olanak tanır. Bunlar boole değerleridir.

Belirtilen ad öneki net olduğu sürece karma tablosu anahtarlarını hecelemenize gerek yoktur. Örneğin, Ad yerine n ve İfade yerine e kullanabilirsiniz.

Örnekler

Compare-Object

Hesaplanan özelliklerle, giriş nesnelerinin özelliklerinin nasıl karşılaştırılacağını kontrol edebilirsiniz. Bu örnekte, değerleri doğrudan karşılaştırmak yerine, değerler aritmetik işlemin sonucuyla (modül 2) karşılaştırılır.

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

ConvertTo-Html

ConvertTo-Html, bir nesne koleksiyonunu bir HTML tablosuna dönüştürebilir. Hesaplanan özellikler, tablonun nasıl sunulacağını kontrol etmenize olanak tanır.

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

Bu örnek, PowerShell takma adlarının listesini ve her takma ad verilen komut için sayı parametrelerini içeren bir HTML tablosu oluşturur. ParameterCount sütununun değerleri ortalanmıştır.

Format-Custom

Format-Custom, bir nesnenin sınıf tanımına benzer bir biçimde özel bir görünümünü sağlar. Daha karmaşık nesneler, karmaşık türlerle derinlemesine iç içe geçmiş üyeler içerebilir. Format-Custom'un Derinlik parametresi, tüm özellikler için genişletme derinliğini belirtir. derinlik tuşu, özellik başına genişletme derinliğini belirtmenize olanak tanır.

Bu örnekte, derinlik anahtarı, Get-Date cmdlet'inin özel çıktısını basitleştirir. Get-Date bir DateTime nesnesi döndürür. Bu nesnenin Date özelliği aynı zamanda bir DateTime nesnesidir, dolayısıyla nesne yuvalanmıştır.

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

Bu örnekte, çıktının adını ve biçimini Get-ChildItem'den değiştirmek için hesaplanan özellikleri kullanıyoruz.

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

Bu örnekte hesaplanan özellik, dosyaları içerik türüne göre sınıflandırmak için kullanılan bir Tür özelliği ekler.

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'i, bir koleksiyondaki nesnelere ilişkin bir özelliğin değerini çok sütunlu bir liste olarak görüntülemenize olanak tanır.

Bu örnekte dosya adını ve boyutunu (kilobayt cinsinden) geniş bir liste olarak görmek istiyoruz. Format-Wide birden fazla özelliği görüntülemediğinden, iki özelliğin değerini tek bir değerde birleştirmek için hesaplanmış bir özellik kullanırız.

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'i, nesneleri belirtilen özelliğin değerine göre gruplar halinde görüntüler. Bu örnekte hesaplanan özellik, her içerik türündeki dosya sayısını sayar.

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'i nesnelerin sayısal özelliklerini hesaplar. Bu örnekte, 1 ile 10 arasında 3'e tam olarak bölünebilen sayıların sayısını (Toplamı) elde etmek için hesaplanmış bir özellik kullanıyoruz.

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

Not

Diğer cmdlet'lerden farklı olarak Measure-Object, hesaplanan özellikler için karma tablosunu kabul etmez. Bir komut dosyası bloğu kullanmanız gerekir.

Select-Object

Select-Object cmdlet'iyle nesnelerin çıktısına ek üyeler eklemek için hesaplanan özellikleri kullanabilirsiniz. Bu örnekte C harfiyle başlayan PowerShell takma adlarını listeliyoruz. Select-Object'i kullanarak takma adın, eşlendiği cmdlet'in ve cmdlet için tanımlanan parametre sayısına ilişkin sayının çıktısını alırız. Hesaplanan bir özelliği kullanarak ParameterCount özelliğini oluşturabiliriz.

$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

Hesaplanan özellikleri kullanarak verileri özellik başına farklı düzenlerde sıralayabilirsiniz. Bu örnek, bir CSV dosyasındaki verileri Tarihe göre artan sırada sıralar. Ancak her tarih içinde satırları Satılan Birimlere göre azalan şekilde sıralar.

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

Notlar

  • İfade komut dosyası bloğunu, bir karma tablosunda İfade girişi olarak belirtmek yerine, bağımsız değişken olarak doğrudan belirtebilirsiniz. Örneğin:

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

    Bu örnek, Sort-Object, Group-Object< gibi Ad anahtarı aracılığıyla bir özelliğin adlandırılmasını gerektirmeyen (veya desteklemeyen) cmdlet'ler için uygundur. /code> ve Measure-Object.

    Özelliğin adlandırılmasını destekleyen cmdlet'ler için komut dosyası bloğu bir dizeye dönüştürülür ve çıktıda özelliğin adı olarak kullanılır.

  • İfade komut dosyası blokları alt kapsamlarda çalışır; bu, arayanın değişkenlerinin doğrudan değiştirilemeyeceği anlamına gelir.

  • İfade komut dosyası bloklarının çıktısına ardışık düzen mantığı uygulanır. Bu, tek öğeli bir dizinin çıktısının alınmasının o dizinin açılmasına neden olduğu anlamına gelir.

  • Çoğu cmdlet için ifade komut dosyası bloklarındaki hatalar sessizce göz ardı edilir. Sort-Object için, ifade sonlandırma ve komut dosyası sonlandırma hataları çıkıştır ancak ifadeyi sonlandırmazlar.

Ayrıca bakınız

  • about_Hash_Tables
  • ConvertTo-Html
  • Format-Custom
  • Format-List
  • Format-Table
  • Format-Wide
  • Compare-Object
  • Group-Object
  • Measure-Object
  • Select-Object
  • Sort-Object
  • .NET'te biçim türleri

İlgili makaleler