2013-07-17 77 views
2

我想爲我自己構建的自定義Powershell Commandlet使用SqlServerCmdletSnapin。如果我下面的代碼添加到我的PSM1的開頭:爲Powershell模塊添加Powershell Snapin並導入多次

if ((Get-PSSnapin -Name sqlserverprovidersnapin100 -ErrorAction SilentlyContinue) -eq $null) 
{ 
    Add-PsSnapin sqlserverprovidersnapin100 
} 

if ((Get-PSSnapin -Name sqlservercmdletsnapin100 -ErrorAction SilentlyContinue) -eq $null) 
{ 
    Add-PsSnapin sqlservercmdletsnapin100 
} 
Export-ModuleMember Invoke-SqlCmd 

一切都很正常,我第一次運行:

Import-Module MyModule -Force

但是,我第二次運行:

Import-Module MyModule -Force

我收到以下錯誤:

Add-PsSnapin : An item with the same key has already been added.

和我的代碼不能再調用Invoke-SqlCmd。將PowerShell管理單元添加到我的自定義模塊的最佳方式是什麼?

+0

你可以試一下'Add-PsSnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue' – user1578107

+1

也會出現同樣的問題。這個問題似乎是因爲Import-Module似乎不像已經加載的模塊那樣在相同的範圍內運行。不知道爲什麼。 –

+1

如果加載模塊,然後調用一個調用Add-PSSnapin的導出函數,則管理單元會加載到運行空間中,但管理單元的cmdlet只能*模塊腳本*訪問,而不能用於模塊外的代碼。這導致了上面的行爲,如果你做了一個get-pssnapin,那麼管理單元將不會被列出,但是如果你嘗試添加它,你會得到上面的錯誤,因爲技術上snapin已經被加載到了runspace中,但是而不是模塊外部的代碼可以使用它:( –

回答

4

您可能想嘗試通過模塊清單(.psd1)指定您自己的模塊所需的此模塊。請參閱RequiredModules here