Добавление оснастки из модуля не работает, как ожидалось

У меня есть следующий модуль PowerShell под названием module.psm1. Это упрощенный пример. Я делаю действия против 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. Это нормальное поведение? Я вижу такое же поведение для других SnapIns.

У меня есть еще один вопрос:

Когда я импортирую модуль из консоли и когда я загружаю оснастку из моего модуля и выполняю команду из оснастки в консоли, командлеты не распознаются. Когда я загружаю оснастку в модуль, это делается в другом контексте или контексте?

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 мс, и, вероятно, удастся повторно добавить ее просто отлично:

Start-Sleep -m 200

Обычно вам даже не нужно удалять оснастку - она ​​будет удалена сама по себе, когда сессия (окно) закрыта / сценарий завершен. Если вы загружаете оснастку, которая уже загружена, это тоже не имеет значения - вы должны иметь возможность сохранять команды загрузки.

Другие вопросы по тегам