次の方法で共有


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();
    

System.Management.Automation.PowerShell.Invoke メソッドを呼び出す前に、AddCommand メソッドを複数回呼び出すと、最初のコマンドの結果が 2 番目のコマンドにパイプ処理されます。 前のコマンドの結果をコマンドにパイプしない場合は、System.Management.Automation.PowerShell を呼び出して追加します。代わりにAddStatement

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 メソッド。 次の例では、パイプラインにスクリプトを追加して実行します。 この例では、D:\PSScriptsという名前のフォルダーに MyScript.ps1 という名前のスクリプトが既に存在することを前提としています。

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

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

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

カスタム実行空間の作成

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

InitialSessionState オブジェクトの作成

カスタム実行空間を作成するには、まず、System.Management.Automation.Runspaces.InitialSessionState オブジェクトを作成する必要があります。 次の例では、System.Management.Automation.Runspaces.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();
rs.Close();

実行空間の制約

前の例では、すべての組み込みコア Windows PowerShell を読み込む既定の System.Management.Automation.Runspaces.InitialSessionState オブジェクトを作成しました。 また、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);
}

実行空間を閉じます。

rs.Close();

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

Get-Command
Import-Module