Добавление оснастки из модуля не работает, как ожидалось - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть следующий модуль 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.

Другой вопрос, который у меня возникает:

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

1 Ответ

0 голосов
/ 13 марта 2019

Я думаю, как вы запустили это, вы сделали вызов .\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

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

...