다음을 통해 공유


about_Calculated_Properties

간단한 설명

PowerShell은 새 속성을 동적으로 추가하고 파이프라인에 개체 출력의 서식을 변경하는 기능을 제공합니다.

자세한 설명

여러 PowerShell cmdlet은 해당 출력 개체에 새 속성을 추가할 수 있는 매개 변수를 사용하여 입력 개체를 출력 개체로 변환, 그룹화 또는 처리합니다. 이러한 매개 변수를 사용하여 입력 개체의 값을 기반으로 출력 개체에 대해 계산된 새 속성을 생성할 수 있습니다. 계산된 속성은 새 속성의 이름, 값을 계산할 식 및 선택적 서식 정보를 지정하는 키-값 쌍을 포함하는 해시 테이블에 의해 정의됩니다.

지원되는 cmdlet

다음 cmdlet은 Property 매개 변수에 대해 계산된 속성 값을 지원합니다. cmdlet은 Format-* GroupBy 매개 변수에 대한 계산 값도 지원합니다.

다음 목록에서는 계산 속성을 지원하는 cmdlet과 각 cmdlet이 지원하는 키-값 쌍을 항목별로 나열합니다.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label - 선택 사항(PowerShell 6.x에 추가됨)
    • expression
    • width -선택적
    • alignment -선택적
  • Format-Custom

    • expression
    • depth -선택적
  • Format-List

    • name/label -선택적
    • expression
    • formatstring -선택적

    이 동일한 키-값 쌍 집합은 모든 Format-* cmdlet에 대해 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 -선택적

참고 항목

expression 값은 해시 테이블 대신 스크립트 블록일 수 있습니다. 자세한 내용은 참고 섹션을 참조하세요.

해시 테이블 키 정의

  • name/label - 생성되는 속성의 이름을 지정합니다. 사용하거나 해당 별칭을 label서로 교환할 수 name 있습니다.
  • expression - 새 속성의 값을 계산하는 데 사용되는 문자열 또는 스크립트 블록입니다. 문자열인 expression 경우 값은 입력 개체의 속성 이름으로 해석됩니다. 이 옵션은 .보다 expression = { $_.<PropertyName> }짧은 옵션입니다.
  • alignment - 테이블 형식 출력을 생성하는 cmdlet에서 값이 열에 표시되는 방식을 정의하는 데 사용됩니다. 값은 'left', 'center' 또는 'right'여야 합니다.
  • formatstring - 값이 출력에 대해 형식이 지정되는 방법을 정의하는 형식 문자열을 지정합니다. 형식 문자열에 대한 자세한 내용은 .NET의 형식 형식을 참조하세요.
  • width - 값이 표시될 때 표의 최대 너비 열을 지정합니다. 값은 .보다 0커야 합니다.
  • depth- 깊이 매개 변수는 Format-Custom 모든 속성에 대한 확장 깊이를 지정합니다. 키를 depth 사용하면 속성당 확장 깊이를 지정할 수 있습니다.
  • ascending / descending - 하나 이상의 속성에 대한 정렬 순서를 지정할 수 있습니다. 부울 값입니다.

지정된 이름 접두사를 명확하게 지정하지 않는 한 해시 테이블 키의 철자를 지정할 필요가 없습니다. 예를 들어 대신 사용할 수 있습니다 n Name 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 cmdlet에 대한 사용자 지정 출력을 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

cmdlet 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

cmdlet은 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

cmdlet은 Measure-Object 개체의 숫자 속성을 계산합니다. 이 예제에서는 계산된 속성을 사용하여 3으로 균등하게 나눌 수 있는 1에서 10 사이의 숫자 수를 가져옵니다.

스크립트 블록은 숫자가 3으로 나눌 수 있고 $false 다른 모든 숫자에 대해 표시되는 경우 반환 $true 됩니다. Sum 연산은 값을 다음과 같이 처리하고 $false 값을 .로 1 0처리합니다$true.

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

참고 항목

다른 cmdlet과 Measure-Object 달리 계산된 속성에 대한 해시 테이블을 허용하지 않습니다. 스크립트 블록을 사용해야 합니다.

Select-Object

계산 속성을 사용하여 cmdlet을 사용하여 개체 출력에 멤버를 Select-Object 추가할 수 있습니다. 이 예제에서는 문자 C로 시작하는 PowerShell 별칭을 나열합니다. 를 사용하여 Select-Object별칭, 매핑된 cmdlet 및 cmdlet에 대해 정의된 매개 변수 수에 대한 개수를 출력합니다. 계산된 속성을 사용하여 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] $_ }
    

    이 예제는 키(예Sort-ObjectGroup-Object: , 및Measure-Object)를 통해 속성 이름을 지정할 필요(또는 지원)가 없는 cmdlet에 Name 편리합니다.

    속성 이름을 지원하는 cmdlet의 경우 스크립트 블록은 문자열로 변환되고 출력에서 속성의 이름으로 사용됩니다.

  • Expression스크립트 블록은 자식 범위에서 실행되므로 호출자의 변수를 직접 수정할 수 없습니다.

  • 파이프라인 논리는 스크립트 블록의 출력에 Expression 적용됩니다. 즉, 단일 요소 배열을 출력하면 해당 배열이 래핑 해제됩니다.

  • 대부분의 cmdlet의 경우 식 스크립트 블록 내의 오류는 조용히 무시됩니다. 문 종료 및 스크립트 종료 오류의 경우 Sort-Object출력이지만 문을 종료하지는 않습니다.

참고 항목