2011-07-30 75 views
1

我正在寫一個PowerShell腳本模塊。它所做的第一件事情之一是一些檢查,以確保某些必需的值可用。如果不是,模塊不應該繼續加載和初始化。但是,我不知道模塊自己「移除」的方式。我試着調用remove-module(從模塊內部),但並不奇怪,它沒有工作。有沒有其他方法可以讓模塊自行卸載?PowerShell模塊可以卸載自己

我意識到從模塊外部的腳本執行這些操作是微不足道的。但是我正在編寫這個模塊,以便與其他不太熟悉PowerShell的用戶共享。我想不需要在PLUS模塊中包含另一個腳本,然後向他們解釋「這是一個例外,你不能使用普通的導入模塊,你必須始終記住找到並運行這個其他腳本」 。除此之外,如果用戶僅使用導入模塊(而不是使用額外的腳本),那麼它就沒有用處(因爲他們會合理地期望能夠這樣做)。

回答

0

這不是一個確切的答案,但它仍然是一個解決方案。在你描述的場景中,我會換個方式。創建一個外部腳本(不是模塊的一部分),它可以自己檢查先決條件,並且如果缺少某些內容或不會加載模塊,或者始終加載模塊,則檢查成功/失敗 - 由模塊公開的某些內容並在模塊卸載時卸載模塊的失敗。然後用這個腳本代替Import-Module

2

如果檢查不通過,您可能會在模塊中拋出錯誤 - 這會阻止模塊加載。例如儘量節省這是Test.psm1:

throw "Could not load module."; 

嘗試加載這個與導入模塊\ Test.psm1。你會得到這個錯誤,如果你事後給Get-Module打電話,你會看到這個模塊沒有被加載。

+0

嗯,這可能工作。但我認爲它只能在模塊導入時運行的代碼上工作,而不一定是稍後卸載模塊的方式。例如,如果模塊在導入和運行期間運行一些代碼,則可能不會加載模塊。但是,如果您運行導入模塊,然後調用模塊中的某個函數,然後發現模塊應該卸載的內容,我不認爲拋出將允許模塊自行卸載。猜猜我將不得不做一些測試來嘗試。但是,謝謝你的想法嘗試。 – jay

+2

不,你說得對,它只會停止加載,以後不會卸載。我會爭辯說,也許卸載模塊並不是最好的方法 - 在模塊中調用函數會將該函數從使用中移除似乎很奇怪!有點像敲門造成房屋消失......當然,還有什麼會刪除模塊實現?你會重新加載它,再試一次,同樣的事情會發生。也許最好把模塊置於故障狀態,這樣如果你調用了任何函數,你會得到一個錯誤,直到問題得到解決。 – MrKWatkins