2011-11-07 8 views
2

カスタムC#コマンドレットで新しいRunSpaceを作成しないと、悪い習慣(または特定の理由がある)が考えられますか?たとえば、次のようにカスタムコマンドレットがあり、既存のコマンドレットを呼び出す必要があります。これを行う際にスレッドやその他の問題が発生するかどうかは疑問です。カスタムC#コマンドレットを使用して新しいRunSpaceを作成することは悪い習慣ですか?

public class SPCmdletNewBusinessSite : SPNewCmdletBase<SPSite> 
    { 

... 
    private void ExecuteRunspaceCommand() 
      { 
       Runspace runspace = RunspaceFactory.CreateRunspace(); 
       PSSnapInException snapInError; 
       runspace.RunspaceConfiguration.AddPSSnapIn("Microsoft.SharePoint.PowerShell", out snapInError); 
       runspace.ThreadOptions = PSThreadOptions.Default; 
       runspace.Open(); 

       Pipeline pipeline = runspace.CreatePipeline(); 

       Command newSiteProc = new Command("New-SPSite"); 
       newSiteProc.Parameters.Add(new CommandParameter("Url", "http://goober-dc/9393")); 
       newSiteProc.Parameters.Add(new CommandParameter("OwnerAlias", "GOOBER\\Administrator")); 
       newSiteProc.Parameters.Add(new CommandParameter("Template", "STS#1")); 
       newSiteProc.Parameters.Add(new CommandParameter("Language", "1033")); 
       newSiteProc.Parameters.Add(new CommandParameter("ContentDatabase", "Site_Specific_ContentDB")); 

       pipeline.Commands.Add(newSiteProc); 
       Collection<PSObject> results = new Collection<PSObject>(); 

       results = pipeline.Invoke(); 
       foreach (PSObject obj in results) 
       { 
        base.WriteObject(((SPSite)obj.BaseObject).RootWeb.Title); 
       }     

      } 
} 

具体的には、SharePoint 2010 SPSiteを作成し、そのSPSite用の特定のコンテンツデータベースを指定します。パラメータとしてSPContentDatabaseを受け入れるSPSitesCollection.Add()のオーバーロードがありますが、これは内部メソッドです。 RunSpaceを作成してNew-SPSiteコマンドレット(新しいコンテンツデータベースを指定できる)を呼び出すことができ、特定のコンテンツデータベースを使用してサイトを作成できるようにします。

http://msdn.microsoft.com/en-us/library/ms714873(v=VS.85).aspxは、コマンドレット内からコマンドレットを呼び出せるが、New-SPSite(実際のクラスSPCmdletNewSite)も内部であり、直接呼び出すことができないことを示しています。

+0

あなたは余分な実行空間を必要とする理由は明らかではありません。あなたが余分にロードされたスナップインを現在のものから解放しない限り、その理由はありますか?それは本当のコードか擬似コードですか?後者の場合、どの部分が疑似ですか?特に、SPSitesCollection.Add()は記述されていますが、コードでは使用されていません(何かが見逃されてもごめんなさい)。 –

+0

タイトルの質問に興味がある(実際の質問には興味がありません)、新しいランスペースを作成する理由があれば悪い習慣ではないと思います。理由がなければ、それは悪い習慣であり、新しいランスペースは安くはありません。 –

+0

ありがとうRoman - 実際のクラス実装(c#で)が内部密封されているNew-SPSiteコマンドレットを呼び出そうとしていますが、内部密封クラスSPCmdletNewSite:SPNewCmdletBase です。私はcmdletクラスのInvokeを直接呼び出すことができないので、上記のように個別のRunSpaceでコマンドレットを呼び出すことで、どの問題を実行するか作成しているかを調べようとしています。他の選択肢がある場合は、私に知らせてください。私はC#で新しいカスタムコマンドレットを作成するのは比較的新しいです。 –

答えて

2

コマンドレット内で別のコマンドレットを呼び出す場合、通常は、入れ子になったパイプラインを新しいランスペースではなく使用します。これにより、コマンドレットのスコープを使用して、同じ変数とコンテキストにアクセスできるようになります。新しいランスペースは完全に分離されており、結果的に重量が増えますが、呼び出しスコープをポーリングしない場合は望ましいことがあります。私はおそらくネストしたパイプラインが必要だと思いますので、共有ポイントのスナップインを読み込む必要はありません。新しいシェアポイントコマンドレットを呼び出すときに既に読み込まれていると仮定しています。

このメソッドは、コマンドがパイプラインで既に実行されているため、ネストされたパイプラインです。

var pipe = Runspace.DefaultRunspace.CreateNestedPipeline(...); 
pipe.Invoke() 

http://msdn.microsoft.com/en-us/library/system.management.automation.runspaces.runspace.createnestedpipeline(v=VS.85).aspx

+0

驚くばかり!情報を教えていただきありがとうございました。 –

関連する問題