I have the following PowerShell module called module.psm1. This is a simplified example. I am doing actions against SharePoint 2013 so I need the snapin for SharePoint in my module
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'
In my moduletest.ps1 I have a call to Test and the same logic
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
}
When I run function Test from the module the output is:
VERBOSE: Adding
VERBOSE: Removing
VERBOSE: Performing the operation "Remove-PSSnapin" on target "Microsoft.SharePoint.PowerShell".
VERBOSE: Already loaded
So in the module when I remove the SNapIn somehow its not really gone. When I run the code directly form the ps1 file I get:
VERBOSE: Adding
VERBOSE: Removing
VERBOSE: Performing the operation "Remove-PSSnapin" on target "Microsoft.SharePoint.PowerShell".
VERBOSE: Adding
When in my ps1 file the Remove does actually completely remove the SnapIn. Is this normal behavior? I see same behavior for other SnapIns.
Another question I have is:
When I import the module from the console and when I load the SnapIn from my module and execute a command from the snapin in the console then no cmdlets are recognized. When I load the snapin in the module is that being done in a different scope or context?
I think how you ran this was you did a call to
.\moduletest.ps1, and you are describing the output you received from running theTestfunction withinmodule.psm1and then the output you received from the lines of code withinmoduletest.ps1itself afterwards. This would've been more helpful in the description of your question, in order to reproduce the issue. I wasn't sure, at first, if you were saying you were running the lines from the files individually in the ISA or running lines in the command window or both, and which ones where.If you remove a snapin in the context of a script, you obviously need to add it back in the same script if you want to use it again within that script or a session - it does get removed. If you perform some commands at the command line, these would be done in the same context/session as a script called before it is ran in. Ex. if you had the line
$myVariable = "Sushi"inside a file calledmycode.ps1and you did.\mycode.ps1at the command line, and then you didWrite-Host $myVariableat the command line right after, it would printSushi.When you are running your ps1 script lines, this has the ability to remove a snapin, and apparently it does it quickly. When you are trying to remove a snapin from within a function in a module (as you are in
module.psm1), it apparently is still happening, but happening much too slow to be re-added (the re-add fails because it thinks it is still there), because you say when you launch snapin-based commands after the removal/reloading, these fail. I think the module is indeed removing the snapin, but just not reporting to your script it is removed when it checks, in order to be able to re-add it. If you add a delay during the module'sTestfunction between the removal and when it tries to do the re-add of probably 100-200 ms, it will probably succeed at re-adding it just fine:You generally don't ever even really need to remove the snapin, though - it will remove on its own when the session (window) is closed/script is ended. If you load a snapin that is already loaded, it doesn't matter, either - you should be able to keep loading commands.