about_Object_Creation

간단한 설명

PowerShell에서 개체를 만드는 방법을 설명합니다.

자세한 설명

PowerShell에서 개체를 만들고 명령 및 스크립트에서 만든 개체를 사용할 수 있습니다.

개체를 만드는 방법에는 여러 가지가 있습니다. 이 목록은 확정적이지 않습니다.

  • New-Object: .NET Framework 개체 또는 COM 개체의 인스턴스를 만듭니다.
  • Import-Csv/ConvertFrom-CSV: 문자로 구분된 값으로 정의된 항목에서 사용자 지정 개체(PSCustomObject)를 만듭니다.
  • ConvertFrom-Json: JSON(JavaScript Object Notation)에 정의된 사용자 지정 개체를 만듭니다.
  • ConvertFrom-StringData: 키 값 쌍으로 정의된 사용자 지정 개체를 만듭니다.
  • 추가 유형: PowerShell 세션에서 인스턴스화 New-Object할 수 있는 클래스를 정의할 수 있습니다.
  • New-Module: AsCustomObject 매개 변수는 스크립트 블록을 사용하여 정의하는 사용자 지정 개체를 만듭니다.
  • 추가 멤버: 기존 개체에 속성을 추가합니다. 다음과 같이 [System.Int32]간단한 형식에서 사용자 지정 개체를 만드는 데 사용할 Add-Member 수 있습니다.
  • Select-Object: 개체의 속성을 선택합니다. 이미 인스턴스화된 개체에서 사용자 지정 및 계산 속성을 만드는 데 사용할 Select-Object 수 있습니다.

이 문서에서는 다음과 같은 추가 메서드를 다룹니다.

  • 정적 new() 메서드를 사용하여 형식의 생성자를 호출합니다.
  • 속성 이름 및 속성 값의 해시 테이블을 typecasting하여

Static new() 메서드

모든 .NET 형식에는 인스턴스를 new() 보다 쉽게 생성할 수 있는 메서드가 있습니다. 지정된 형식에 대해 사용 가능한 모든 생성자를 볼 수도 있습니다.

형식의 생성자를 보려면 형식 이름 뒤의 new 메서드 이름을 지정하고 키를 누릅니다 <ENTER>.

[System.Uri]::new
OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)

이제 적절한 생성자를 지정하여 System.Uri를 만들 수 있습니다.

[System.Uri]::new("https://www.bing.com")
AbsolutePath   : /
AbsoluteUri    : https://www.bing.com/
LocalPath      : /
Authority      : www.bing.com
...

다음 샘플을 사용하여 인스턴스화할 수 있도록 현재 로드되는 .NET 형식을 확인할 수 있습니다.

[AppDomain]::CurrentDomain.GetAssemblies() |
  ForEach-Object {
    $_.GetExportedTypes() |
      ForEach-Object { $_.FullName }
  }

메서드를 new() 사용하여 만든 개체에는 PowerShell cmdlet에서 만든 것과 동일한 형식의 개체와 동일한 속성이 없을 수 있습니다. PowerShell cmdlet, 공급자 및 확장 형식 시스템은 인스턴스에 추가 속성을 추가할 수 있습니다.

예를 들어 PowerShell의 FileSystem 공급자는 반환된 Get-ItemDirectoryInfo 개체에 6개의 NoteProperty 값을 추가합니다.

$PSDirInfo = Get-Item /
$PSDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    6 NoteProperty
    1 ScriptProperty
   18 Method

DirectoryInfo 개체를 직접 만들 때 6개의 NoteProperty 값이 없습니다.

$NewDirInfo = [System.IO.DirectoryInfo]::new('/')
$NewDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    1 ScriptProperty
   18 Method

확장 형식 시스템에 대한 자세한 내용은 about_Types.ps1xml을 참조 하세요.

이 기능은 PowerShell 5.0에 추가되었습니다.

해시 테이블에서 개체 만들기

속성 및 속성 값의 해시 테이블에서 개체를 만들 수 있습니다.

구문은 다음과 같습니다.

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

이 메서드는 매개 변수가 없는 생성자가 있는 클래스에 대해서만 작동합니다. 개체 속성은 public 및 settable이어야 합니다.

이 기능은 PowerShell 버전 3.0에 추가되었습니다.

해시 테이블에서 사용자 지정 개체 만들기

사용자 지정 개체는 매우 유용하며 해시 테이블 메서드를 사용하여 쉽게 만들 수 있습니다. PSCustomObject 클래스는 이 용도로 특별히 설계되었습니다.

사용자 지정 개체는 함수 또는 스크립트에서 사용자 지정된 출력을 반환하는 훌륭한 방법입니다. 형식이 지정된 출력을 다시 포맷하거나 다른 명령으로 파이프할 수 없는 출력을 반환하는 것보다 더 유용합니다.

일부 변수 값을 설정한 다음 해당 값을 사용하여 사용자 지정 개체를 만드는 명령 Test-Object function 입니다. 이 개체는 cmdlet 도움말 항목의 Update-Help 예제 섹션에서 사용할 수 있습니다.

function Test-Object {
  $ModuleName = "PSScheduledJob"
  $HelpCulture = "en-us"
  $HelpVersion = "3.1.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
  $ModuleName = "PSWorkflow"
  $HelpCulture = "en-us"
  $HelpVersion = "3.0.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
}
Test-Object

이 함수의 출력은 기본적으로 테이블 형식이 지정된 사용자 지정 개체의 컬렉션입니다.

ModuleName        UICulture      Version
---------         ---------      -------
PSScheduledJob    en-us          3.1.0.0
PSWorkflow        en-us          3.0.0.0

사용자는 표준 개체와 마찬가지로 사용자 지정 개체의 속성을 관리할 수 있습니다.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

PSObject 형식 개체는 멤버가 개체에 추가된 순서대로 멤버 목록을 기본. Hashtable 개체가 키-값 쌍의 순서를 보장하지는 않지만 순서를 기본 위해 [pscustomobject] 리터럴 해시 테이블을 캐스팅합니다.

해시 테이블은 리터럴이어야 합니다. 해시 테이블을 괄호로 래핑하거나 해시 테이블을 포함하는 변수를 캐스팅하는 경우 순서가 유지된다는 보장은 없습니다.

$hash = @{
    Name      = "Server30"
    System    = "Server Core"
    PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System      Name     PSVersion
------      ----     ---------
Server Core Server30 4.0

해시 테이블에서 사용자 지정이 아닌 개체 만들기

해시 테이블을 사용하여 사용자 지정이 아닌 클래스에 대한 개체를 만들 수도 있습니다. 사용자 지정이 아닌 클래스에 대한 개체를 만들 때는 초기 시스템 네임스페이스 구성 요소를 생략할 수 있지만 네임스페이스 정규화된 형식 이름이 필요합니다.

예를 들어 다음 명령은 세션 옵션 개체를 만듭니다.

[System.Management.Automation.Remoting.PSSessionOption]@{
  IdleTimeout=43200000
  SkipCnCheck=$True
}

해시 테이블 기능의 요구 사항, 특히 매개 변수가 없는 생성자 요구 사항은 많은 기존 클래스를 제거합니다. 그러나 대부분의 PowerShell 옵션 클래스는 ProcessStartInfo 클래스와 같은 다른 매우 유용한 클래스뿐만 아니라 이 기능을 사용하도록 설계되었습니다.

[System.Diagnostics.ProcessStartInfo]@{
  CreateNoWindow="$true"
  Verb="run as"
}
Arguments               :
ArgumentList            : {}
CreateNoWindow          : True
EnvironmentVariables    : {OneDriveConsumer, PROCESSOR_ARCHITECTURE,
                           CommonProgramFiles(x86), APPDATA...}
Environment             : {[OneDriveConsumer, C:\Users\user1\OneDrive],
                           [PROCESSOR_ARCHITECTURE, AMD64],
                           [CommonProgramFiles(x86),
                           C:\Program Files (x86)\Common Files],
                           [APPDATA, C:\Users\user1\AppData\Roaming]...}
RedirectStandardInput   : False
RedirectStandardOutput  : False
RedirectStandardError   : False
...

매개 변수 값을 설정할 때 해시 테이블 기능을 사용할 수도 있습니다. 예를 들어 , 의 SessionOption 매개 변수 값입니다 New-PSSession. cmdlet은 해시 테이블일 수 있습니다.

New-PSSession -ComputerName Server01 -SessionOption @{
  IdleTimeout=43200000
  SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
  Frequency="Daily"
  At="15:00"
}

제네릭 개체

PowerShell에서 제네릭 개체를 만들 수도 있습니다. 제네릭은 저장하거나 사용하는 하나 이상의 형식에 대한 자리 표시자(형식 매개 변수)를 포함하는 클래스, 구조체, 인터페이스 및 메서드입니다.

다음 예제에서는 Dictionary 개체를 만듭니다.

$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One     1

제네릭에 대한 자세한 내용은 .NET의 제네릭을 참조하세요.

참고 항목