我一直在寫一個 Cmdlet,為了保持我的界面干凈,我一直在手動匯出我關心的功能Export-ModuleMember。
但是,有人指出我也可以將我的函式直接放在作用global: 域中,而無需呼叫Export-ModuleMember.
哪個更可取?
# Option A: Export-ModuleMember
function Do-Something {}
Export-ModuleMember -Function Do-Something
# Option B: global scope
function global:Do-AnotherThing {}
# Something else?
謝謝!
我的預感是這樣Export-ModuleMember更好,因為它讓呼叫者決定函式最終在哪個范圍內(例如,另一個 cmdlet 可以匯入我的 cmdlet,而不會全域公開那些匯出的函式),但我不確定。
uj5u.com熱心網友回復:
你很準。在安裝模塊時,不正確的匯出函式會規避通常預期的行為。
例如,Import-Module如果 cmdlet 踩踏當前會話已經可用的 cmdlet ,則防止破壞。宣告具有全域作用域的函式可以繞過這一點,并且很少有時間應該這樣做,除非模塊的目的是實際覆寫某些內容(例如它可能以某種方式設定或修改提示)。這樣做是一種期望,對于誰通過模塊檔案安裝模塊應該非常清楚。
注意: Clobbering 與類繼承中多載或覆寫成員的基本原則相同。創建一個具有相同名稱的新物體,該物體可能(多載)或可能不(覆寫)具有不同的簽名。
即使Import-Module默認情況下Import-Module -AllowClobber在 clobbering 上會出錯,如果您需要 cmdlet 會破壞現有的 cmdlet,并且讓用戶選擇是否允許 clobbering,這也是解決方案。
但我也不推薦Export-ModuleMember。相反,您應該使用清單 ( ModuleName.psd1) 來準備您的模塊,并在那里指定匯出的函式和 cmdlet。您還可以在清單中設定許多其他內容。
它的好處是使模塊定義在操作上更容易理解。現在您不必用一堆Export-ModuleMember命令亂扔代碼。
注意:如果您沒有在模塊清單中指定要匯出的函式或 cmdlet,或者沒有且不使用
Export-ModuleMember,則將匯出所有函式和 cmdlet。這對于給定的模塊可能是可取的,也可能不是,但理解這一點很重要。
關于撰寫模塊的附加資訊
根據評論中的要求,這里有一些關于設計和撰寫 PowerShell 模塊的附加鏈接:
- 撰寫 Windows PowerShell 模塊
- 盡管這在Legacy SDK部分,但本部分中的資訊對于學習如何創建模塊仍然很有用。避免創建管理單元。
- PowerShell 模塊創作注意事項和PowerShell 腳本性能注意事項
- 兩個頁面下方的腳本和開發部分包含很多關于頂層模塊的好資訊。如果您對模塊開發很認真,我建議您好好閱讀本節。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323348.html
上一篇:Powershell計算機名輸出
