我有以下称为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
}
当我从模块运行功能Test时,输出为:
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文件中,“删除”实际上确实完全删除了SnapIn。这是正常行为吗?对于其他管理单元,我看到相同的行为。
我还有一个问题:
当我从控制台导入模块,并且从模块加载SnapIn并从控制台中的snapin执行命令时,无法识别任何cmdlet。当我在模块中加载管理单元时,是在其他作用域或上下文中完成的吗?
答案 0 :(得分:0)
我认为您如何运行此方法是您对.\moduletest.ps1
进行了调用,并且您正在描述通过在Test
中运行module.psm1
函数收到的输出,然后再收到的输出然后从moduletest.ps1
本身的代码行开始。为了重现问题,这在描述问题时会更有帮助。首先,我不确定是否要说是在ISA中分别运行文件中的行,还是在命令窗口中运行行,或者两者都在运行,以及哪一个在哪里。
如果您在脚本的上下文中删除一个管理单元,显然,如果您想在该脚本或会话中再次使用它,则显然需要将其重新添加到同一脚本中。如果您在命令行中执行某些命令,则这些命令将在与运行该脚本之前调用的脚本相同的上下文/会话中完成。如果您在名为$myVariable = "Sushi"
的文件中包含mycode.ps1
行,并且在命令行中执行了.\mycode.ps1
,然后又在命令行中执行了Write-Host $myVariable
,则它将打印Sushi
。
在运行ps1脚本行时,它可以删除管理单元,并且显然可以快速完成。当您尝试从模块中的函数中删除管理单元时(就像在module.psm1
中一样),它显然仍在发生,但是发生得太慢而无法重新添加(重新添加失败,因为它认为它仍然存在),因为您说在删除/重新加载后启动基于管理单元的命令时,这些命令将失败。我认为该模块确实在删除管理单元,但只是不向您的脚本报告,因此在检查时会删除该管理单元,以便能够重新添加它。如果您在模块的Test
函数删除和尝试重新添加之间添加了100到200 ms的延迟,则可能会成功地重新添加它:
Start-Sleep -m 200
您通常甚至根本不需要删除该管理单元-在关闭会话(窗口)/结束脚本时,它会自行删除。如果您加载已加载的管理单元,也没关系-您应该能够继续加载命令。