Windows PowerShell ホスト クイック スタート

アプリケーションでWindows PowerShellをホストするには、System.Management.Automation.PowerShell クラスを使用します。 このクラスは、コマンドのパイプラインを作成し、それらのコマンドを実行するメソッドを実行空間で提供します。 ホスト アプリケーションを作成する最も簡単な方法は、既定の実行空間を使用する方法です。 既定の実行空間には、すべての主要なコマンドがWindows PowerShellされます。 アプリケーションでカスタム コマンドのサブセットのみを公開する場合はWindows PowerShell実行空間を作成する必要があります。

既定の実行空間の使用

最初に、既定の実行空間を使用し 、System.Management.Automation.PowerShell クラスの メソッドを使用して、コマンド、パラメーター、ステートメント、およびスクリプトをパイプラインに追加します。

AddCommand

System.Management.Automation.PowerShell を使用します AddCommand 。 パイプラインにコマンドを追加する メソッド。 たとえば、マシンで実行中のプロセスの一覧を取得するとします。 このコマンドを実行する方法は次のとおりです。

  1. System.Management.Automation.PowerShell オブジェクトを作成します。

    PowerShell ps = PowerShell.Create();
    
  2. 実行するコマンドを追加します。

    ps.AddCommand("Get-Process");
    
  3. コマンドを呼び出します。

    ps.Invoke();
    

AddCommand System.Management.Automation.PowerShell.Invokeメソッドを呼び出す前に メソッドを 2 回呼び出した場合、最初のコマンドの結果は 2 番目のコマンドにパイプされます。 前のコマンドの結果をパイプ処理しない場合は、System.Management.Automation.PowerShell AddStatement を呼び出して追加します。 instead. (要求オブジェクトを解析できませんでした: JSON マップ フィールド base_parameters には 'key' と 'value' が設定されることが予期されていましたが、代わりに 'key: "..."' が設定されました。)

AddParameter

前の例では、パラメーターを指定せずに 1 つのコマンドを実行します。 System.Management.Automation.PSCommand を使用して、コマンドにパラメーターを追加できます AddParameter 。 メソッドをオーバーライドします。 たとえば、次のコードは、マシンで実行されているという名前のすべてのプロセスの一 PowerShell 覧を取得します。

PowerShell.Create().AddCommand("Get-Process")
                   .AddParameter("Name", "PowerShell")
                   .Invoke();

メソッドを繰り返し呼び出すことによって、追加の AddParameter パラメーターを追加できます。

PowerShell.Create().AddCommand("Get-ChildItem")
                   .AddParameter("Path", @"c:\Windows")
                   .AddParameter("Filter", "*.exe")
                   .Invoke();

System.Management.Automation.PowerShell を呼び出して、パラメーター名と値のディクショナリ を追加することもできます。 AddParameters メソッド。

IDictionary parameters = new Dictionary<String, String>();
parameters.Add("Path", @"c:\Windows");
parameters.Add("Filter", "*.exe");

PowerShell.Create().AddCommand("Get-Process")
   .AddParameters(parameters)
      .Invoke()

AddStatement

System.Management.Automation.PowerShell を使用してバッチ処理をシミュレートできます AddStatement 。 メソッド。パイプラインの末尾にステートメントを追加します。 次のコードは、 という名前の実行中のプロセスの一覧を取得し PowerShell 、実行中のサービスの一覧を取得します。

PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Process").AddParameter("Name", "PowerShell");
ps.AddStatement().AddCommand("Get-Service");
ps.Invoke();

AddScript

System.Management.Automation.PowerShell AddScript を呼び出して、既存のスクリプトを実行できます。 メソッドをオーバーライドします。 次の例では、パイプラインにスクリプトを追加して実行します。 この例では、 という名前のフォルダーに という名前の MyScript.ps1 スクリプトが既に存在すると想定しています D:\PSScripts

PowerShell ps = PowerShell.Create();
ps.AddScript("D:\PSScripts\MyScript.ps1").Invoke();

という名前のブール型パラメーターを AddScript 受け取る メソッドのバージョンも用意されています useLocalScope 。 このパラメーターが に設定されている true 場合、スクリプトはローカル スコープで実行されます。 次のコードは、ローカル スコープでスクリプトを実行します。

PowerShell ps = PowerShell.Create();
ps.AddScript(@"D:\PSScripts\MyScript.ps1", true).Invoke();

カスタム実行空間の作成

前の例で使用した既定の実行空間では、すべてのコア Windows PowerShell コマンドが読み込まれますが、すべてのコマンドの指定したサブセットのみを読み込むカスタム実行空間を作成できます。 パフォーマンスを向上させる (多数のコマンドの読み込みがパフォーマンスに影響する) 場合や、操作を実行するユーザーの機能を制限する場合に、これを行う必要があります。 限られた数のコマンドのみを公開する実行空間は、制約付き実行空間と呼ばれる。 制約付き実行空間を作成するには 、System.Management.Automation.Runspaces.Runspace クラスと System.Management.Automation.Runspaces.InitialSessionState クラスを使用します。

InitialSessionState オブジェクトの作成

カスタム実行空間を作成するには、まず System.Management.Automation.Runspaces.InitialSessionState オブジェクトを作成する必要 があります。 次の例では 、System.Management.Automation.Runspaces.RunspaceFactory を使用して、既定の InitialSessionState オブジェクトを作成した後に実行空間を作成します。

InitialSessionState iss = InitialSessionState.CreateDefault();
Runspace rs = RunspaceFactory.CreateRunspace(iss);
rs.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
ps.AddCommand("Get-Command");
ps.Invoke();

実行空間の制約

前の例では、すべての組み込みコア オブジェクトを読み込む既定のSystem.Management.Automation.Runspaces.InitialSessionStateオブジェクトを作成Windows PowerShell。 System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2メソッドを呼び出して、Microsoft.PowerShell.Core スナップインにコマンドのみを読み込む InitialSessionState オブジェクトを作成することもできます。 より制約のある実行空間を作成するには 、System.Management.Automation.Runspaces.InitialSessionState.Create メソッドを呼び出して空の InitialSessionState オブジェクトを作成し、InitialSessionState にコマンドを追加する必要があります。

指定したコマンドのみを読み込む実行空間を使用すると、パフォーマンスが大幅に向上します。

System.Management.Automation.Runspaces.SessionStateCmdletEntryクラスのメソッドを使用して、初期セッション状態のコマンドレットを定義します。 次の例では、空の初期セッション状態を作成し、 コマンドと コマンドを定義し、初期 Get-Command Import-Module セッション状態に追加します。 その後、その初期セッション状態によって制約される実行空間を作成し、その実行空間でコマンドを実行します。

初期セッション状態を作成します。

InitialSessionState iss = InitialSessionState.Create();

コマンドを定義し、初期セッション状態に追加します。

SessionStateCmdletEntry getCommand = new SessionStateCmdletEntry(
    "Get-Command", typeof(Microsoft.PowerShell.Commands.GetCommandCommand), "");
SessionStateCmdletEntry importModule = new SessionStateCmdletEntry(
    "Import-Module", typeof(Microsoft.PowerShell.Commands.ImportModuleCommand), "");
iss.Commands.Add(getCommand);
iss.Commands.Add(importModule);

実行空間を作成して開きます。

Runspace rs = RunspaceFactory.CreateRunspace(iss);
rs.Open();

コマンドを実行し、結果を表示します。

PowerShell ps = PowerShell.Create();
ps.Runspace = rs;
ps.AddCommand("Get-Command");
Collection<CommandInfo> result = ps.Invoke<CommandInfo>();
foreach (var entry in result)
{
    Console.WriteLine(entry.Name);
}

を実行すると、このコードの出力は次のようになります。

Get-Command
Import-Module