Поделиться через


Краткое руководство по узлу 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, результат первой команды будет передан второй и т. д. Если вы не хотите передать результат предыдущей команды в команду, добавьте ее, вызвав System.Management.Automation.PowerShell. вместо этогоAddStatement.

AddParameter

В предыдущем примере выполняется одна команда без каких-либо параметров. Параметры можно добавить в команду с помощью 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();

Существует также версия метода 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();
rs.Close();

Ограничение пространства выполнения

В предыдущем примере мы создали объект по умолчанию System.Management.Automation.Runspaces.InitialSessionState, который загружает все встроенные ядра Windows PowerShell. Можно также вызвать метод System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2 для создания объекта InitialSessionState, который загружает только команды в оснастке Microsoft.PowerShell.Core. Чтобы создать более ограниченное пространство выполнения, необходимо создать пустой объект InitialSessionState, вызвав метод System.Management.Automation.Runspaces.InitialSessionState.Create, а затем добавить команды в 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