2009-09-25 8 views
86

時々一緒に実行されるPowerShellスクリプトのグループがあります。各スクリプトでは、特定のスナップインをロードする必要があります。Add-PSSnapinを呼び出す前にPowerShellスナップインが既に読み込まれているかどうかを確認する方法

今すぐ各スクリプトはAdd-PSSnapin XYZを呼び出しています。今

私は、その後のスクリプトがスローバックツーバック複数のスクリプトを実行する場合:それはalerady追加されるため

は、Windows PowerShellスナップインXYZを追加することはできません。スナップインの名前を確認して、もう一度お試しください。

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

答えて

126

あなたはスナップインを照会が、それはそれを見つけることができない場合は、エラーにすることはないPowerShellを伝えるこのような何か、でそれを行うことができる必要があります:

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

ああ、ほらを入力して

もっと読みます!これは私が必要としていたものです。ありがとう!私は実験でこれに似たものを試してみましたが、「エラーアクションSilentlyContinue」についてはわかりませんでした。 – joshuapoehls

+2

SilentlyContinueは、デフォルトでスナップインが見つからない場合、Get-PSSnapinが静かにnullを返さないためです。それは誤りです。 – Rich

+1

遅延について:[この記事では](http://mcpmag.com/articles/2009/05/19/snapins-on-standby.aspx)では、スナップインが登録されているかどうかをチェックする方法の完全なコード例が提供されていますそれをロードする前に。 – herzbube

21

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

Add-PSSnapin -Name <snapin> -ErrorAction SilentlyContinue 
+6

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

+0

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

3

私はScottSaadのコードサンプル@試みたが、それは私のために動作しませんでした。私は正確に理由を知ることはできませんでしたが、小切手は信頼できず、時には成功し、時にはうまくいかないことがありました。 this

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

コード礼儀を:私はName性質上Where-Objectフィルタリングを使用すると、より良い働いたことがわかりました。

1

Scott Saadsが動作しますが、これはやや速いです。 私はそれを測定していませんが、errormessageを生成しないので少し速くロードされるようです。 #REQUIRES -PSSnapin Microsoft.PowerShell...コメント/プリプロセッサディレクティブを:

$snapinAdded = Get-PSSnapin | Select-String $snapinName 
if (!$snapinAdded) 
{ 
    Add-PSSnapin $snapinName 
} 
4

Surpisingly、誰もスクリプトが依存関係を指定するためのネイティブな方法に言及していません。 -RunAsAdministratorと標高を必要とするのと全く同じで、-Modules Module1,Module2のモジュールと特定のランスペースバージョンがあります。 Get-Help about_requires

+0

この解決策は私にはこれを行う「正しい」方法と思われます。 – Grax

+0

私がこれを持っていた問題は、必要なスナップインがロードされていない場合にPowershellがエラーを返すことで、誰もがスナップインがロードされていないと思ったと仮定します。 –

+0

モジュールは新しいもので、PSSnapinsではなく、必要に応じて自動的にロードされるモジュールです。しかし、スナップインなしで動作するスクリプトの部分を実行することによって、少なくとも何も壊れたり散らばったりすることはありません。 – Alexey

関連する問題