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