2015-09-17 34 views
0

我有一個PowerShell模塊,設置5個變量與模塊範圍內,像這樣:如何在發生錯誤時取消導入模塊?

Set-Variable DatabaseName  -Option Constant -Value "DbName" 
Set-Variable DomainName  -Option Constant -Value "DomainName" 
Set-Variable ServerInstance -Option Constant -Value "Server\Instance" 
Set-Variable Server   -Option ReadOnly -Value (New-Object Microsoft.SqlServer.Management.Smo.Server $ServerInstance) 
Set-Variable Database   -Option ReadOnly -Value ($Server.Databases[$DatabaseName]) 

如果不設置這些變量正確,整個模塊基本上屬於過去,什麼都不會工作。

我可以檢查變量的唯一方法是設置屬性檢查是否$Database爲空。然而這段代碼:

if ($Database -eq $null) { Write-Error 'Variables not set.' Remove-Module ModuleName }

不起作用,因爲該模塊尚未完成尚未導入。

使用throw關鍵字給我這個錯誤,它並不真正說明了什麼問題:

import-module : The module to process 'Module.psm1', listed in 
field 'ModuleToProcess/RootModule' of module manifest 'C:\Users\Me\My Documents\WindowsPowerShell\Modules\Module\Module.psd1' was not 
processed because no valid module was found in any module directory. 
At line:1 char:1 
+ import-module Module 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ResourceUnavailable: (Module:String) [Import-Module], PSInvalidOperationException 
    + FullyQualifiedErrorId : Modules_ModuleFileNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand 

什麼是「正確」的方式中止在PowerShell中的模塊的進口?

+1

我認爲你應該設計你的模塊的方式,它總是有效的,所以不需要取消導入模塊。你的根本問題是什麼? –

+0

你有什麼建議?唯一想到的是爲用戶提供cmdlet來設置變量本身的值。 – Jake

+2

這取決於你的需求。但是,如果你有一個函數,例如執行sql查詢,我會給該函數一個包含連接信息的數據庫上下文對象(例如散列表),並將其傳遞給每個函數調用,而不是訪問包含這些信息的模塊範圍變量 –

回答

1

不應該使用try/catch功能嗎?

Try 
{ 
    // DO your import 
} 
Catch 
{ 
    $ErrorMessage = $_.Exception.Message 
    $FailedItem = $_.Exception.ItemName 
    Break 
} 
+0

我可以,但我不會在腳本中導入。它直接從PowerShell提示。寫一個大的一行try/catch塊似乎有點過分。 – Jake

+0

回想起這個答案,我完全誤解了加茂的話。但現在它非常有意義。 – Jake