PowerShell模块和SnapIns

时间:2013-01-30 21:38:56

标签: powershell module pssnapin

我创建了几个完全依赖于Microsoft.SharePoint.PowerShell snapIn的实用程序模块。

在我的机器上运行时脚本都运行正常,我的配置文件中没有任何模块或管理单元,用于PowerShell“默认加载”,但是在其他机器上,它们的配置文件不能保证是干净的。

在我的模块加载器.psd1文件中,我正在使用以下

NestedModules = @( 'Microsoft.SharePoint.PowerShell',
        '.\Modules\CustomModule.psd1')

我使用ps1文件来触发包含以下导入模块命令

的模块导入
Import-Module -Name "$dir\.\CustomModules.psd1" -Global -Force -PassThru

如果我以这种方式运行,我会在配置文件包含Microsoft.SharePoint.PowerShell管理单元的计算机上出现名称冲突错误,因为已经加载了管理单元。

我知道我们可以使用-NoProfile参数执行PowerShell命令,但在我们的场景中这不是有效的解决方案。

我还尝试从NestedModules部分删除snapin并在导入模块之前在.ps1文件中运行以下内容但是SnapIn没有显示为已加载,因此模块导入失败。

if ((Get-PSSnapin | ? {$_.Name -eq 'Microsoft.SharePoint.PowerShell'}) -eq $null)
{
    Write-Host "Adding PSSnapin 'Microsoft.SharePoint.PowerShell'"
    Add-PSSnapin 'Microsoft.SharePoint.PowerShell'  }

如何重新使用此解决方案以确保管理单元将正确加载,并且无论用户配置文件如何,模块都将成功导入?

我的理想情况如下:

Task.ps1   (The custom task me or other devs are trying to achieve)
     > Calls ImportModules.ps1   (Hides the importing logic of modules and snap-ins)
           > Imports CustomModules.psd1  (Imports all modules, functions, global vars into the runspace)

2 个答案:

答案 0 :(得分:3)

我会转而让PSD1文件通过NestedModules加载snappin。创建CustomModules.psm1文件并将ModuleToProcess(或v3中的RootModule)设置为“CustomModules.psm1”。从NestedModules中删除SharePoint dll。然后将这样的内容添加到CustomModules.psm1文件中:

function AddSnapin
{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $Name
    )

    Process {
        foreach ($n in $name)
        {
            if (!(Get-PSSnapin $n -ErrorAction SilentlyContinue)) {
                Add-PSSnapin $n
            }
            else {
                Write-Verbose "Skipping $n, already loaded."
            }
        }
    }
}

AddSnapin Microsoft.SharePoint.PowerShell -Verbose

答案 1 :(得分:2)

您可以测试程序集名称的存在

$assemblyname = "Microsoft.SharePoint.PowerShell"
if (([appdomain]::currentdomain.getassemblies() | 
      Where {$_ -match $AssemblyName}) -eq $null )
{
  add-pssnapin Add-PSSnapin 'Microsoft.SharePoint.PowerShell'
}

或者只是加载它并忽略错误(如果它已经加载):

Add-PSSnapin -Name "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue