Add-PSSnapinを呼び出す前にPowerShellスナップインが既に読み込まれているかどうかを確認する方法


90

一緒に実行されることもあれば、1つずつ実行されることもあるPowerShellスクリプトのグループがあります。各スクリプトには、特定のスナップインが読み込まれている必要があります。

現在、各スクリプトはAdd-PSSnapin XYZ最初に呼び出しています。

ここで、複数のスクリプトを連続して実行すると、後続のスクリプトがスローされます。

Windows PowerShellスナップインXYZは追加されているため、追加できません。スナップインの名前を確認して、再試行してください。

Add-PSSnapinを呼び出す前に、各スクリプトでスナップインが既に読み込まれているかどうかを確認するにはどうすればよいですか?

回答:


133

次のようなものでそれを行うことができるはずです。ここでは、スナップインを照会しますが、見つからない場合でもエラーを出さないようにPowerShellに指示します。

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

あはは!これはまさに私が必要としたものです、ありがとう!私は実験でこれに似たものを試しましたが、-ErrorAction SilentlyContinueについて知りませんでした。
joshuapoehls 09/09/25

2
SilentlyContinueは、デフォルトでスナップインが見つからない場合、Get-PSSnapinが静かにnullを返さないためです。エラーになります。
リッチ

1
レイジーの場合:この記事では、スナップインがロードされる前に登録されているかどうかを確認する方法の完全なコード例を示します。
herzbube 2012年

21

スコットはすでにあなたに答えを与えました。とにかくそれをロードして、すでにロードされている場合はエラーを無視することもできます:

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue

6
インストールされていないなどの他の理由でスナップインが読み込まれなかった場合も、黙って続行します。これは、スクリプトを使用している人々の問題の診断を困難にする可能性があります。
Graham Ambrose

その場合、最初にスナップインが登録されているかどうかを確認できます。
シェイレヴィ

4

驚いたことに、依存関係を指定するスクリプトのネイティブな方法である#REQUIRES -PSSnapin Microsoft.PowerShell...コメント/プリプロセッサディレクティブについては誰も言及していません。まったく同じ-RunAsAdministrator-Modules Module1,Module2、を使用した昇格、を使用したモジュール、および特定のRunspaceバージョンが必要になる場合があります。

入力してもっと読む Get-Help about_requires


この解決策は、これを行う「正しい」方法であるように私には思われます。
Grax32、2015年

1
これで私が抱えていた問題は、必要なスナップインがロードされていない場合、Powershellがエラーを返すことです。そうでない場合、誰もがスナップインをロードすることを望むでしょう。
ドウェインドリスキル

1
モジュールは新しいものであり、PSSnapinsではなく、必要に応じて自動的に読み込まれるモジュールです。しかし、スナップインなしで機能するスクリプトの一部を実行しても、少なくとも何も壊れたり散らかされたりすることはありません。
Alexey

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.