0

我创建了几个都依赖于 Microsoft.SharePoint.PowerShell 管理单元的实用程序模块。

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

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

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

我使用 ps1 文件来触发这些模块导入,其中包含以下 Import Module 命令

Import-Module -Name "$dir\.\CustomModules.psd1" -Global -Force -PassThru

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

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

我还尝试从 NestedModules 部分删除管理单元并在导入模块之前在 .ps1 文件中运行以下命令,但管理单元未显示为已加载,因此模块导入失败。

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)
4

2 回答 2

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
于 2013-02-02T22:47:00.627 回答
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
于 2013-02-02T20:15:49.933 回答