【发布时间】:2013-07-16 14:56:36
【问题描述】:
我想将 SqlServerCmdletSnapin 用于我正在构建的自定义 Powershell Commandlet。如果我将以下代码添加到 PSM1 的开头:
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 : 已添加具有相同键的项。
我的代码不能再调用 Invoke-SqlCmd。将 powershell 管理单元添加到我的自定义模块的最佳方法是什么?
【问题讨论】:
-
你可以试试
Add-PsSnapin sqlserverprovidersnapin100 -ErrorAction SilentlyContinue -
出现同样的问题。这个问题似乎是因为 Import-Module 似乎不在与已加载模块相同的范围内运行。不知道为什么。
-
如果您加载一个模块,然后调用一个调用 Add-PSSnapin 的导出函数,该管理单元将被加载到运行空间,但该管理单元的 cmdlet 将仅可直接访问模块脚本,但不要在模块之外编写代码。这会导致上述行为,如果您执行 get-pssnapin,则不会列出该管理单元,但是如果您尝试添加它,则会收到上述错误,因为从技术上讲,管理单元已加载到运行空间中,但是不是模块外的代码可以使用它的方式:(
-
这种奇怪行为@StephenConnolly 的任何解决方案/变通方法?
标签: powershell cmdlets pssnapin