Как проверить, загружена ли оснастка 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
}