2013-02-12 4 views
9

아마도이 질문에 대한 답변은 전에 .... 그러나 내 요구에 대한 구체적인 답변을 찾지 못했습니다. BTW 내가 PowerShell을 3PowerShell에서 비헤이비어 (메서드)를 사용하여 실제 개체를 만드는 방법은 무엇입니까?

음을 사용하고

, 나는 PowerShell의 새로운이야하지만 난 그렇게 객체로 작업하는 것은 나에게 매우 중요합니다, C#을 개발자로 경험을 많이 가지고있다. (즉 좋지 않을까하지만, 물론 모든 이들의)

그래서 내가 PowerShell 스크립트에서 OOP 개념을 적용 할 깨끗한 방법이 있는지 궁금하네요, 예를 들어 내가 좋아하는 것 특정 일이있다 할 것.

참고 : PowerShell에서 DTO를 만들기 위해 C# 코드를 작성할 수 있으며 C#으로 PowerShell 바이너리 모듈을 만들 수 있음을 알고 있습니다. 이전에는 그랬지만 지금은 무엇을 찾고 있습니까? PowerShell에서 내 코드를 모두 쓸 수 있지만 인 개체 지향 방식입니다. ,

function New-Person 
(
    [Parameter()][string]$firstName 
) 
{ 
    function Walk() 
    { 
     Write-Host "Walking..."; 
    } 

    $person = New-Object psobject; 

    $person | Add-Member -MemberType NoteProperty -Name FirstName -Value $firstName; 

    #This line does not work 
    #$person | Add-Member -MemberType CodeMethod -Name Walk -Value Walk; 

    return $person; 
} 

$MyPerson = New-Person -firstName "JP"; 

$MyPerson; 

#This line does not work 
$MyPerson.Walk(); 
  • 캡슐화 동작 :이 같은 것을

    • 가 PowerShell의 객체를 생성하고뿐만 아니라 PowerShell에서 작성된 기능을 노출 : 내가 좋아하는 것

      것이다 것 이는 내 개체 내부에서 함수를 만든 다음 비공개로 표시하는 것을 의미합니다.

    • [갖게되어 기쁘다]. 기본 동작 클래스를 상속하고 특수화하여 메서드를 재정의 할 수 있습니다.

    • [Nice to have]. 내가 단독으로 단위 테스트에 내 PowerShell을 방법을 생각 시작할 수 내가

    을 지금까지 수행 한 내용을 (난 그냥 OOP 기능에 초점을 맞추고있어이 작업을 수행하는 훼방 같은 도구가 알고) 인터페이스를 만들기 너희들이 올바른 방향으로 방법으로 객체를 생성하는

  • 답변

    10

    두 가지 옵션을 날 지점 경우 특성을 가진 개체를 만드는 전용 (DTO의)하지만 난 감사하겠습니다

    내 개체에 동작을 추가하고 싶습니다 :

    1. 추가 회원
    2. 새로운 모듈 -AsCustomObject을

    코드 샘플 :

    $person | Add-Member -MemberType ScriptMethod -Value { 
        'I do stuff!' 
    } 
    
    $person = New-Module -AsCustomObject -ScriptBlock { 
        $Property = 'value' 
        [string]$Other = 'Can be strongly typed' 
    
        function MyMethod { 
         'I do stuff!' 
        } 
    
    } 
    

    편집 : 후자의 예 속성에서 ... 공공/민간의 말은 표시되지 않습니다 "기본적으로". Export-ModuleMember을 사용하여 공개 내용을 결정하고 공개 될 -Variable (속성) 및/또는 -Function (방법)을 지정할 수 있습니다. 명시 적 Export-ModuleMember없이 "일반"모듈 - 내보내기 전용 함수 (메소드)와 동일하게 작동합니다.

    +0

    이것은 정말 흥미 롭습니다. 지금 테스트하고 있습니다. – Jupaol

    +0

    두 예제 모두 훌륭하게 작동합니다. 나는 첫번째 것을 사용하고 싶다. 'ScriptMethod' -'Value' 본문에서 매개 변수를 요청할 수있는 방법이 있습니까? '$ MyPerson.Walk ("mioles 또는 whateva"의 수)와 같은 것을 할 수있는 것; – Jupaol

    +4

    함수 정의 안에 보통의'param' 블록을 추가하십시오. 예 : '$ obj = "foo"| 추가 멤버 -MemberType ScriptMethod -Value {param ($ first, $ second) "첫 번째는 $ first, 두 번째 것은 $ second"} -Name DoStuff -PassThru; $ obj.DoStuff ('abc', '123') – latkin

    5

    전체 OOP (상속 포함, 인터페이스는 아니지만) PSClass은 MS-PL 라이선스 구현입니다.

    +0

    기록을 위해, 나는 당신의 답을 뽑지 않았고, 나는 이미 그 프로젝트를 발견했고 나는 개념에 대한 증명을하고있다. 이 답변을 투표하십시오. – Jupaol

    +0

    니스 ... +1. – BartekB

    4

    PowerShell v5는 전체 클래스 지원을 도입하여 속성을 사용하여 클래스를 쉽게 만들고 메서드를 구현할 수 있습니다.

    주제에 대한 Trevor의 멋진 블로그 게시물을 확인하십시오. Trevor Sullivan, Implementing a .net Class

    +0

    링크를 제공해 주셔서 감사합니다. 바로 제가 직접 찾을 수 없었던 것입니다. –

    관련 문제