从模块添加管理单元无法正常工作

时间:2018-09-06 20:41:20

标签: powershell powershell-module pssnapin

我有以下称为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。当我在模块中加载管理单元时,是在其他作用域或上下文中完成的吗?

1 个答案:

答案 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

您通常甚至根本不需要删除该管理单元-在关闭会话(窗口)/结束脚本时,它会自行删除。如果您加载已加载的管理单元,也没关系-您应该能够继续加载命令。