Як перевірити, чи оснастка PowerShell вже завантажена, перед викликом Add-PSSnapin


90

У мене є група сценаріїв PowerShell, які іноді запускаються разом, іноді по одному. Кожен із сценаріїв вимагає завантаження певної оснастки.

Зараз кожен скрипт викликає Add-PSSnapin XYZспочатку.

Тепер, якщо я запускаю декілька сценаріїв послідовно, наступні сценарії кидають:

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

Як я можу перевірити кожен сценарій, щоб перевірити, чи оснастка вже завантажена перед викликом Add-PSSnapin?

Відповіді:


133

Ви повинні мати можливість зробити щось подібне, де ви запитуєте Snapin, але скажете PowerShell не помилятися, якщо він не може його знайти:

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

А-а-а! Це саме те, що мені потрібно було, дякую! Я спробував щось подібне до цього у своїх експериментах, але я не знав про -ErrorAction SilentlyContinue.
joshuapoehls

2
SilentlyContinue тому, що Get-PSSnapin не повертає тихо null, якщо за замовчуванням не знаходить оснащення. Це помилки.
Rich

1
Для ледачих: Ця стаття містить повний приклад коду, як також перевірити, чи не зареєстрована оснастка перед її завантаженням.
herzbube

21

Скотт вже дав вам відповідь. Ви також можете завантажити його в будь-якому випадку і проігнорувати помилку, якщо вона вже завантажена:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
Це також мовчки тривало б, якби оснастка не завантажувалася з інших причин, таких як не встановлення. Що може призвести до важких діагностичних проблем для людей, які використовують ваш сценарій.
Грем Амброз

Правильно, у такому випадку ми можемо спочатку перевірити, чи зареєстрована оснастка.
Шей Леві

4

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

Дізнайтеся більше, набравши текст Get-Help about_requires


Мені здається, це рішення є "правильним" способом зробити це.
Grax32,

1
Проблема, яка у мене була з цим, полягає в тому, що Powershell повертає помилку, якщо потрібний модуль оснащення не завантажений, і я б припустив, що всі бажають, щоб модуль завантажувався, якщо це не так.
Дуейн Дріскілл

1
Модулі новіші, і саме модулі завантажуються автоматично за потреби, а не PSSnapins, ви маєте рацію. Але принаймні нічого не буде порушено або засмічено, запустивши частину сценарію, яка працює без закріпки.
Олексій

3

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

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

Код люб'язно це .


1

Скотт Саадс працює, але це здається мені дещо швидшим. Я не вимірював його, але, здається, він завантажується трохи швидше, оскільки він ніколи не видає повідомлення про помилку.

$snapinAdded = Get-PSSnapin | Select-String $snapinName
if (!$snapinAdded)
{
    Add-PSSnapin $snapinName
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.