【问题标题】:Add Powershell Snapin for Powershell Module and Import Multiple Times为 Powershell 模块添加 Powershell 管理单元并多次导入
【发布时间】: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


【解决方案1】:

您可能想尝试通过模块清单 (.psd1) 指定您自己的模块所需的此模块。请参阅RequiredModules here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多