Как проверить, если оснастка PowerShell уже загружен перед вызовом Add-PSSnapin
У меня есть группа сценариев PowerShell, которые иногда запускаются вместе, иногда по одному. Каждый из сценариев требует загрузки определенной оснастки.
прямо сейчас каждый скрипт вызывает Add-PSSnapin XYZ в начале.
теперь, если я запускаю несколько сценариев спина к спине последующие сценарии бросают:
не удается добавить оснастку Windows PowerShell XYZ, поскольку она добавлена alerady. Проверьте имя оснастки и попробуйте снова.
Как я могу проверить каждый скрипт, чтобы убедиться, что оснастка уже загружена перед вызовом Add-PSSnapin?
5 ответов:
вы должны быть в состоянии сделать это с чем-то вроде этого, где вы запрашиваете Snapin, но говорите PowerShell не ошибаться, если он не может найти его:
if ( (Get-PSSnapin -Name MySnapin -ErrorAction SilentlyContinue) -eq $null ) { Add-PsSnapin MySnapin }
Скотт, уже дал вам ответ. Вы также можете загрузить его в любом случае и игнорировать ошибку, если она уже загружена:
Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue
Удивительно, но никто не упомянул родной способ для скриптов указывать зависимости:
#REQUIRES -PSSnapin Microsoft.PowerShell...комментарий директива препроцессора. Точно так же вы можете потребовать повышения с-RunAsAdministrator, модули-Modules Module1,Module2, и определенная версия Runspace.подробнее, введя
Get-Help about_requires
я попробовал пример кода @ScottSaad, но это не сработало для меня. Я не выяснил точно, почему, но проверка была ненадежной, иногда успешной, а иногда и нет. Я обнаружил, что с помощью
Where-Objectфильтрация наNameсвойства лучше работал:if ((Get-PSSnapin | ? { $_.Name -eq $SnapinName }) -eq $null) { Add-PSSnapin $SnapinName }вежливость код этой.
Скотт Саадс работает, но это кажется мне несколько быстрее. Я не измерял его, но он, кажется, загружается немного быстрее, так как он никогда не производит errormessage.
$snapinAdded = Get-PSSnapin | Select-String $snapinName if (!$snapinAdded) { Add-PSSnapin $snapinName }
Comments