2013-07-12 2 views
3

모듈로드시 PowerShell에서 초기화 코드를 호출합니까?Powershell 모듈 초기화

나는 Perl BEGIN 블록이나 생성자와 같은 것을 찾고있다.

NEW-MODULE과 IMPORT-MODULE 모두 PSCustomObject를 반환합니다. 스크립트에서 긴 코드를 피하기 위해 모듈에 사용자 지정 개체를 캡슐화하려고합니다. 열려있는 코드에서 잘 테스트하는 한 가지 방법은 다음과 같습니다

$m = new-module -scriptblock { 
New-Object PSCustomObject | 
    Add-Member NoteProperty -name person -value Frodo -passthru | 
    Add-Member ScriptMethod Who { $this.person } -passthru | 
    Add-Member ScriptMethod Mod { 
     param($x) 
     $this.person = $x 
     } -passthru 
} -ascustomobject -returnresult 

가 이상적으로는 모듈에이 코드를 삭제하고 같은 것을 사용하고 싶습니다 : 개체에 대한 핸들이 될 myObj로

$MyObj = Import-Module -Name ".\MyPackage" -AsCustomObject 

을하고있는 첫 번째 스 니펫과 동일합니다.

감사합니다.

답변

1

모듈은 실제로 개체가 아니라 cmdlet을 출력합니다. 모듈은 관련 cmdlet 집합을 제공해야합니다. Import-Modules-ArgumentList 매개 변수를 사용하여 show here과 같이 모듈에 데이터를 보내는 방법이 있습니다. 이 기법을 사용하여 예를 들어 cmdlet에 연결할 서버 이름을 제공 할 수 있습니다. PowerCLI 모듈은 다른 스크립트 범위 연결 개체 ($script:connection)를 생성하는 cmdlet을 사용하여 해당 처리하는 다른 cmdlet을 확인하고 이와 유사한 존재하는 경우를 다시 사용하는 것이 :

당신이 원한다면 그것은 분명하지 않다
#test.psm1 
$script:myvar = "hi" 
function Show-MyVar {Write-Host $script:myvar} 
function Set-MyVar ($Value) {$script:myvar = $Value} 
#end test.psm1 
+0

우수. 감사. –

3

(Perl의 BEGIN 블록과 같이) 모듈이로드 될 때 초기화 코드를 실행하거나 ("생성자"가 제안하는) 사용자 정의 클래스를 생성하려는 경우.

모듈의 초기화 코드는 쉽습니다. 모듈을 가져올 때 함수에 포함되지 않은 모듈의 모든 코드가 실행됩니다.

사용자 지정 클래스 만들기는 PS에서 기본적으로 지원되지 않습니다. 그러나보십시오 : http://psclass.codeplex.com/. C#, VBScript 등을 작성하고 Add-Type을 사용할 수도 있습니다.

가져 오기 모듈은 주어진 이름의 모듈 인스턴스를 1 개만 가질 수 있기 때문에 클래스를 시뮬레이트하지 않습니다. 싱글 톤 클래스를 사용하는 것이 가장 좋습니다. (BTW, import-module에는 -passthru 매개 변수가 있습니다.이 매개 변수는 마지막 코드 행을 싱글 톤으로 만듭니다. 모듈 코드에 export-module -variable * -function *을 추가해야합니다.) 새 모듈을 사용하여 클래스를 시뮬레이트합니다. 그리고 예를 들어, new-myClass이라는 함수로 감쌀 수 있습니다.

여러분이 -ASCustomObject 매개 변수를 사용하면 "this"를 지원하지 않는 해시 테이블이 생깁니다 (해시 테이블 값은 스크립트 블록에 참조 할 수있는 기본 방법이 없습니다). 해시 테이블 그 자체). -AsCustomObject없이 new-module을 사용하면 (예 : new-myclass와 같은 팩토리 함수를 잠재적으로 사용하는 경우) & $myModule $varInMyModule으로 "this.varInMyModule"을 시뮬레이션 할 수 있습니다. 그러나 Add-Member를 사용하여 PSCustomObject를 만들면 스크립트 메서드는 $ this에 액세스 할 수 있으며 일반적으로 속성 및 메서드가있는 일반적인 개체와 훨씬 비슷하게 작동합니다.