Windows PowerShell 主机快速入门

若要在应用程序中承载 Windows PowerShell,请使用system.web类。 此类提供创建命令管道,然后在运行空间中执行这些命令的方法。 创建主机应用程序的最简单方法是使用默认的运行空间。 默认的运行空间包含所有核心 Windows PowerShell 命令。 如果希望应用程序仅公开 Windows PowerShell 命令的子集,则必须创建自定义运行空间。

使用默认运行空间

首先,我们将使用默认的运行空间,并使用 system.web 类的方法向管道添加命令、参数、语句和脚本。

AddCommand

使用的是 AddCommand 。 向管道添加命令的方法。 例如,假设您希望获取计算机上正在运行的进程的列表。 运行此命令的方法如下所示。

  1. 创建一个 " 管理 " 对象。

    PowerShell ps = PowerShell.Create();
    
  2. 添加要执行的命令。

    ps.AddCommand("Get-Process");
    
  3. 调用命令。

    ps.Invoke();
    

如果在调用该方法之前多次调用此 AddCommand 方法,则第一个命令的结果将通过管道传递到第二个命令,依此类推。 如果你不想通过管道将前一个命令的结果传递给命令,请通过调用 " AddStatement

AddParameter

前面的示例执行一个不带任何参数的命令。 可以通过使用 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.exception 添加参数名称和值的字典 。 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

您可以使用 "管理" 功能 AddStatement 对批处理进行模拟。 方法,它将其他语句添加到管道末尾。 下面的代码获取名为的正在运行的进程的列表 PowerShell ,然后获取正在运行的服务的列表。

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

AddScript

可以通过调用 "System.object" 来运行现有脚本。 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 命令,但你可以创建一个自定义运行空间,它只加载指定的所有命令子集。 你可能想要执行此操作来提高性能 (加载更多命令) 性能下降或限制用户执行操作的能力。 仅公开有限数量的命令的运行空间称为受限制的运行空间。 若要创建受限制的运行空间,请使用InitialSessionState 类和 ". 管理类"。

创建 InitialSessionState 对象

若要创建自定义运行空间,必须首先创建 InitialSessionState 对象。 在下面的示例中,我们将使用 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();

约束运行空间

在上面的示例中,我们创建了一个默认的InitialSessionState对象,该对象加载所有内置核心 Windows PowerShell。 我们还可以调用 CreateDefault2 方法来创建一个 InitialSessionState 对象,该对象只会加载 InitialSessionState 管理单元中的命令,而不是。 若要创建更受限制的运行空间,必须通过调用 InitialSessionState 方法来创建一个空的 InitialSessionState 对象,然后将命令添加到 InitialSessionState。

使用仅加载您指定的命令的运行空间可显著提高性能。

你可以使用 SessionStateCmdletEntry 类的方法来定义初始会话状态的 cmdlet)。 下面的示例创建一个空的初始会话状态,然后将和命令定义并添加 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