2013-07-12 149 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 = Import-Module -Name ".\MyPackage" -AsCustomObject 

,並有MyObj中是一個句柄的對象與第一個片段相同。

建議感激。

回答

1

模塊真的應該輸出cmdlet,而不是對象。一個模塊應該提供一組相關的cmdlet。有一種方法可以使用Import-Modules-ArgumentList參數將數據發送到模塊,如顯示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。

導入模塊無法模擬一個類,因爲您只能擁有一個具有給定名稱的模塊的實例 - 充其量只有一個單例類。 (順便說一下,導入模塊確實有一個-passthru參數,它可以或多或少地使你的最後一行代碼工作 - 作爲一個單例,你還必須將export-module -variable * -function *添加到你的模塊代碼中)。你可以使用New-Module模擬一個班雖然。例如,您可以將其封裝在名爲new-myClass的函數中。

順便說一句,如果你使用-ASCustomObject參數,你最終有一個哈希表,不支持「本」(字是腳本塊哈希表值不具有一個內置的方式來指散列表本身)。如果您使用不帶-AsCustomObject的新模塊(並且可能使用工廠函數,例如new-myclass),那麼您可以使用& $myModule $varInMyModule來模擬「this.varInMyModule」。但是,如果使用Add-Member創建PSCustomObject,那麼腳本方法可以訪問$ this,並且它通常更像是具有屬性和方法的典型對象。