어떻게 만드 사용자 지정 유형에 PowerShell 에 대한 스크립트를 사용합니까?

StackOverflow https://stackoverflow.com/questions/59819

  •  09-06-2019
  •  | 
  •  

문제

고 싶을 수 있을 정의하고 사용자 지정 형식의 일부에서 내 PowerShell 스크립트가 있습니다.예를 들어,척 했을 위한 필요는 개체는 다음과 같이 구성됩니다.

Contact
{
    string First
    string Last
    string Phone
}

어떻게 나를 만드는 방법에 대해 이동이 사용할 수 있도록 그것은에서와 같은 기능은 다음과 같다:

function PrintContact
{
    param( [Contact]$contact )
    "Customer Name is " + $contact.First + " " + $contact.Last
    "Customer Phone is " + $contact.Phone 
}

무언가가 다음과 같이 가능한 또는 추천에 PowerShell?

도움이 되었습니까?

해결책

을 만드는 사용자 정의 형식에서 수행 할 수 있습 PowerShell.
커크 먼로 실제로는 두 개의 큰 게시물 상세 프로세스습니다.

의 예약 Windows PowerShell 에서 작업하여 Manning 또한 코드 샘플을 만들기 위한 특정 도메인 언어를 사용자 지정 형식을 만들.이 책은 우수한 모든 주위에,그래서 정말 좋습니다.

는 경우에 당신은 빠른 방법은 위를 만들 수 있습을 만드는 기능 사용자 지정성

function New-Person()
{
  param ($FirstName, $LastName, $Phone)

  $person = new-object PSObject

  $person | add-member -type NoteProperty -Name First -Value $FirstName
  $person | add-member -type NoteProperty -Name Last -Value $LastName
  $person | add-member -type NoteProperty -Name Phone -Value $Phone

  return $person
}

다른 팁

전 PowerShell3

PowerShell 의 확장 유형을 시스템지 않은 원래를 만들 수 있 콘크리트할 수 있는 형식에 대한 테스트 방법은 당신이에서 매개 변수입니다.가 필요하지 않은 경우 테스트하는,당신이 잘 어떤 다른 방법 위에서 언급된다.

당신이 원하는 경우에는 실제 입력할 수 있는 캐스팅 또는 유형을 확인하세로에서 스크립트 예...그 할 수 없 할 수 없이 쓰는 C#또는 VB.net 컴파일.PowerShell2,사용할 수 있습니다 추가"유형"명령하는것이 매우 simmple:

add-type @"
public struct contact {
   public string First;
   public string Last;
   public string Phone;
}
"@

역사적 설명:PowerShell1 그것도 어렵습니다.당신은 수동으로 사용 CodeDom,거기에 아주 오래된 기능 새로운 구조체 에서 스크립트 PoshCode.org 는 것이 도움이 될 것입니다.귀하의를 들면 된다:

New-Struct Contact @{
    First=[string];
    Last=[string];
    Phone=[string];
}

Add-TypeNew-Struct 은 당신이 실제로 테스트에서 클래스 param([Contact]$contact) 고 새로운 것을 만들어 사용하는 $contact = new-object Contact 그래서...

PowerShell3

가 필요하지 않은 경우"진짜"할 수 있는 클래스에 캐스팅,당신은 사용하지 않아도 추가 구성원하는 방식 스티븐과 다른 설명 니다.

이후 PowerShell2 사용할 수 있습니성 매개변수에 대한 새로운 객체:

$Contact = New-Object PSObject -Property @{ First=""; Last=""; Phone="" }

에 PowerShell3,우리가 사용하는 기능 PSCustomObject 가속기를 추가하는 형태:

[PSCustomObject]@{
    PSTypeName = "Contact"
    First = $First
    Last = $Last
    Phone = $Phone
}

당신은 여전히 단지 하나의 개체,그래서 만들어야 합니다 New-Contact 기능하는지 확인 매체에서 나오는 동일한지만,당신은 지금 쉽게 확인 매개 변수는"는"하나의 유형으로 장식된 매개 변수 PSTypeName 특성:

function PrintContact
{
    param( [PSTypeName("Contact")]$contact )
    "Customer Name is " + $contact.First + " " + $contact.Last
    "Customer Phone is " + $contact.Phone 
}

PowerShell5

PowerShell5 모든 변경 사항을,그리고 우리는 드디어 classenum 언어 키워드를 정의하는 유형을(있다 없 struct 하지만 그건 괜찮아요):

class Contact
{
    # Optionally, add attributes to prevent invalid values
    [ValidateNotNullOrEmpty()][string]$First
    [ValidateNotNullOrEmpty()][string]$Last
    [ValidateNotNullOrEmpty()][string]$Phone

    # optionally, have a constructor to 
    # force properties to be set:
    Contact($First, $Last, $Phone) {
       $this.First = $First
       $this.Last = $Last
       $this.Phone = $Phone
    }
}

우리는 또한 새로운 방법을 만드는 물체를 사용하지 않고 New-Object: [Contact]::new() 사실 당신은 유지하는 클래스는 간단하고 정의하지 않는 생성자를 만들 수 있습 객체를 캐스팅하여 해시 테이블(않고 있지만 생성자,수 없을 적용하는 모든 속성을 설정해야 합니다):

class Contact
{
    # Optionally, add attributes to prevent invalid values
    [ValidateNotNullOrEmpty()][string]$First
    [ValidateNotNullOrEmpty()][string]$Last
    [ValidateNotNullOrEmpty()][string]$Phone
}

$C = [Contact]@{
   First = "Joel"
   Last = "Bennett"
}

이것이 바로가기방법:

$myPerson = "" | Select-Object First,Last,Phone

스티븐 Murawski 의 대답은 중대하다,그러나 나는 다음과 같이 짧은(또는 오히려 그냥 깔끔한 선택이 아닌 객체를 사용하여 추가 멤버 구문):

function New-Person() {
  param ($FirstName, $LastName, $Phone)

  $person = new-object PSObject | select-object First, Last, Phone

  $person.First = $FirstName
  $person.Last = $LastName
  $person.Phone = $Phone

  return $person
}

놀라게 아무도 없이 간단한 옵션(3 대 이상)을 만들기 위한 사용자 정의 개체:

[PSCustomObject]@{
    First = $First
    Last = $Last
    Phone = $Phone
}

유형 될 것입니다 PSCustomObject,실제 사용자 지정 형식을 하지만입니다.하지만 그것은 아마를 만드는 가장 쉬운 방법은 사용자 지정 개체입니다.

의 개념이있 PSObject 및 추가 회원이 사용할 수 있는.

$contact = New-Object PSObject

$contact | Add-Member -memberType NoteProperty -name "First" -value "John"
$contact | Add-Member -memberType NoteProperty -name "Last" -value "Doe"
$contact | Add-Member -memberType NoteProperty -name "Phone" -value "123-4567"

이 같은 출력:

[8] » $contact

First                                       Last                                       Phone
-----                                       ----                                       -----
John                                        Doe                                        123-4567

다른 대안(알고 있어요)이 형식을 정의하는 C#/VB.그물을 로드하는 어셈블리로 PowerShell 에 대한 직접 사용합니다.

이 동작은 확실히 권장할 수 있기 때문에 다른 스크립트의 섹션 또는 스크립트와 함께 작동하는 실제적인 개체입니다.

여기에는 힘든 길을 만들기 사용자 지정 유형에 저장할 수 있습니다.

$Collection = @()

$Object = New-Object -TypeName PSObject
$Object.PsObject.TypeNames.Add('MyCustomType.Contact.Detail')
Add-Member -InputObject $Object -memberType NoteProperty -name "First" -value "John"
Add-Member -InputObject $Object -memberType NoteProperty -name "Last" -value "Doe"
Add-Member -InputObject $Object -memberType NoteProperty -name "Phone" -value "123-4567"
$Collection += $Object

$Object = New-Object -TypeName PSObject
$Object.PsObject.TypeNames.Add('MyCustomType.Contact.Detail')
Add-Member -InputObject $Object -memberType NoteProperty -name "First" -value "Jeanne"
Add-Member -InputObject $Object -memberType NoteProperty -name "Last" -value "Doe"
Add-Member -InputObject $Object -memberType NoteProperty -name "Phone" -value "765-4321"
$Collection += $Object

Write-Ouput -InputObject $Collection
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top