我创建了几个完全依赖于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)
答案 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