어떻게 만드 사용자 지정 유형에 PowerShell 에 대한 스크립트를 사용합니까?
-
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-Type
나 New-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 모든 변경 사항을,그리고 우리는 드디어 class
고 enum
언어 키워드를 정의하는 유형을(있다 없 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