Как проверить, загружена ли оснастка PowerShell, прежде чем вызывать Add-PSSnapin

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

В настоящее время каждый script вызывает Add-PSSnapin XYZ в начале.

Теперь, если я запускаю несколько сценариев с обратной стороны последующих сценариев throw:

Невозможно добавить оснастку Windows PowerShell XYZ, потому что она добавлена. Проверьте имя оснастки и повторите попытку.

Как я могу выполнить каждую проверку script, чтобы проверить, загружена ли оснастка до вызова Add-PSSnapin?

Ответ 1

Вы должны сделать это с помощью чего-то вроде этого, где вы запрашиваете Snapin, но не сообщите PowerShell об ошибке, если он не может найти его:

if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null )
{
    Add-PsSnapin MySnapin
}

Ответ 2

Скотт уже дал вам ответ. Вы также можете загрузить его и проигнорировать ошибку, если она уже загружена:
Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

Ответ 3

Сюрпризно, никто не упоминал родной путь для сценариев, чтобы указать зависимости: директиву #REQUIRES -PSSnapin Microsoft.PowerShell... comment/preprocessor. Точно так же вы могли бы потребовать повышение с помощью -RunAsAdministrator, модулей с -Modules Module1,Module2 и конкретной версией Runspace.

Подробнее, набрав Get-Help about_requires

Ответ 4

Я попробовал образец кода @ScottSaad, но для меня это не сработало. Я точно не знаю, почему, но чек был ненадежным, иногда преуспевающим, а иногда и нет. Я обнаружил, что использование фильтрации Where-Object для свойства Name улучшилось:

if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) {
    Add-PSSnapin $SnapinName 
}

Код предоставлен this.

Ответ 5

Скотт Саадс работает, но это кажется мне несколько быстрее. Я не оценил его, но он, похоже, загружается чуть быстрее, поскольку он никогда не создает ошибку.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}