【发布时间】:2018-09-06 20:41:19
【问题描述】:
我有以下名为 module.psm1 的 PowerShell 模块。这是一个简化的例子。我正在针对 SharePoint 2013 执行操作,因此我需要模块中的 SharePoint 管理单元
function Test() {
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) {
Write-Verbose "Adding" -Verbose
Add-PSSnapin "Microsoft.SharePoint.PowerShell" -Verbose
}
else {
Write-Verbose "Already loaed" -Verbose
}
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -ne $null) {
Write-Verbose "Removing" -Verbose
#Remove-PSSnapin "Microsoft.SharePoint.PowerShell" -Verbose
}
else {
Write-Verbose "Already removed" -Verbose
}
Get-PSSnapin "Microsoft.SharePoint.PowerShell"
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell") -eq $null) {
Write-Verbose "Adding" -Verbose
Add-PSSnapin "Microsoft.SharePoint.PowerShell" -Verbose
}
else {
Write-Verbose "Already loaded" -verbose
}
}
Export-ModuleMember -Function 'Test'
在我的 moduletest.ps1 中,我调用了 Test 和相同的逻辑
Import-Module "$PSScriptRoot\module.psm1" -Force
Test
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null) {
Write-Verbose "Adding" -Verbose
Add-PSSnapin "Microsoft.SharePoint.PowerShell" -Verbose
}
else {
Write-Verbose "Already loaed" -Verbose
}
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -ne $null) {
Write-Verbose "Removing" -Verbose
Remove-PSSnapin "Microsoft.SharePoint.PowerShell" -Verbose
}
else {
Write-Verbose "Already removed" -Verbose
}
Get-PSSnapin "Microsoft.SharePoint.PowerShell"
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell") -eq $null) {
Write-Verbose "Adding" -Verbose
Add-PSSnapin "Microsoft.SharePoint.PowerShell" -Verbose
}
else {
Write-Verbose "Already loaded" -verbose
}
当我从模块运行函数测试时,输出是:
VERBOSE: Adding
VERBOSE: Removing
VERBOSE: Performing the operation "Remove-PSSnapin" on target "Microsoft.SharePoint.PowerShell".
VERBOSE: Already loaded
所以在模块中,当我以某种方式移除 SNapIn 时,它并没有真正消失。 当我直接从 ps1 文件中运行代码时,我得到:
VERBOSE: Adding
VERBOSE: Removing
VERBOSE: Performing the operation "Remove-PSSnapin" on target "Microsoft.SharePoint.PowerShell".
VERBOSE: Adding
在我的 ps1 文件中,Remove 实际上完全删除了 SnapIn。这是正常行为吗?我看到其他 SnapIn 的行为相同。
我的另一个问题是:
当我从控制台导入模块并从我的模块加载管理单元并从控制台中的管理单元执行命令时,将无法识别任何 cmdlet。当我在模块中加载管理单元时,是在不同的范围或上下文中完成的吗?
【问题讨论】:
-
您是直接在 SharePoint 服务器上执行此操作,还是通过显式或隐式远程处理?您使用的是什么编辑器/外壳。我见过加载 SharePoint 或 Exchange 模块的时候,尤其是在 ISE 中,直到您点击命令选项卡中的刷新按钮后,cmdlet 才会显示。使用控制台主机时这不是问题,我没有尝试过使用 VSCode。
-
我在 SharePoint 服务器上以常规 PowerShell 控制台运行此表单。在模块中与直接在 ps1 中加载其他管理单元时,我看到相同的行为
-
我观察到与 SharePoint 2016 相同的问题。加载模块,添加管理单元,调用模块中删除管理单元的函数,现在无法再添加/删除它。添加时会出现
An item with the same key has already been added.中断异常,尝试删除管理单元时会出现No Windows PowerShell snap-ins matching the pattern 'microsoft.sharepoint.powershell' were found.删除模块内的管理单元时会弄乱它。
标签: powershell powershell-module pssnapin