2010-08-11 63 views
2

我正在構建一個使用Powershell的自動化系統,並且我想定義自定義的.Net類型,以便可以以類似於我編寫的其他代碼的方式構建我的應用程序。起初,我嘗試使用'Add-Type'將c#文件中的類型導入到我的應用程序中,但我發現這樣做非常痛苦,因爲.net類型只能在每個Powershell會話期間加載一次。這意味着當出現錯誤時,對我的代碼進行單個更改需要我重新啓動我的應用程序(我可能會使用C#)。有沒有更好的方法來獲取Powershell中的'類'語義(定義自定義類型)?

目前我通過使用工廠函數來模擬Powershell中的類型,這些函數使用我需要的語義動態生成PSObjects。這確實有效,但它非常冗長,我似乎無法聲明私有變量或封裝方法。

有沒有更簡單的方法來實現我想要的?

如果沒有....

我不知何故,我想通過編寫使用抽象數據類型我PowerShell代碼找錯了樹?

有沒有更好的方法來構建我應該知道的系統?

我現在能做些什麼封裝嗎?

回答

2

1)我還沒有嘗試過,但這個項目看起來很有前途:PSClass - Object Oriented Scripting in Powershell。它提供的一些功能:

PsClass目前在 實施在一個文件中的Powershell。使其易於使用。它支持OO概念下的 。

  • 繼承
  • 多態性
  • 封裝
  • 的構造方法參數
  • 說明 - 讀寫變量
  • 方法 - scriptblocks
  • 屬性與獲取scriptblocks和可選設置scriptblocks
  • 靜態和私人筆記和方法

2)你可以使用自定義模塊這樣的:

$o = New-Module -AsCustomObject -Function GetVar, AddToVar { 
    $script:var = 1 
    function checkRange { if ($var -gt 3 -or $var -lt 0) { throw 'not in range <0,3>' } } 
    function GetVar { $script:var } 
    function AddToVar { param($add) checkRange; $script:var += $add; $script:var } 
} 
$o.GetVar() 
$o.AddToVar(2) 
$o.AddToVar(1) 
$o.GetVar() 
$o.checkRange() 
$o | gm 

嘗試將它複製到你的IDE /控制檯,並運行它。 $script:var是私人會員,只能用於功能GetVarAddToVarcheckRange也是私人的。


就我個人而言,如果我需要真正的OOP(可用C#),我不會使用PowerShell進行這樣的任務。PowerShell對對象有一些支持,但對於OOP很差。

+0

1+謝謝,我會研究這個 看起來像Ruby + Python在這裏有優勢,當涉及到動態腳本 – Willbill 2010-08-12 09:54:51

+1

這取決於你需要什麼,但如果你真的找oop語言,PowerShell是imho不是一個好的選擇。目標受衆是其他人 - 主要是管理員和高級用戶,而不是程序員。但必須說的是,它爲程序員提供了很好的工作機會;) – stej 2010-08-12 09:59:07

相關問題