Hostitel Windows PowerShellu - rychlý start

K hostování Windows PowerShell ve vaší aplikaci použijete třídu System.Management.Automation.PowerShell. Tato třída poskytuje metody, které vytvoří kanál příkazů a pak tyto příkazy spustí v runspace. Nejjednodušší způsob, jak vytvořit hostitelskou aplikaci, je použít výchozí prostředí runspace. Výchozí runspace obsahuje všechny základní Windows PowerShell příkazů. Pokud chcete, aby vaše aplikace zpřístupňuje pouze podmnožinu Windows PowerShell příkazů, musíte vytvořit vlastní runspace.

Použití výchozího runspace

Začneme tím, že použijeme výchozí prostředí runspace a pomocí metod třídy System.Management.Automation.PowerShell přidáme do kanálu příkazy, parametry, příkazy a skripty.

AddCommand

Použijete System.Management.Automation.PowerShell. AddCommand metoda pro přidání příkazů do kanálu. Předpokládejme například, že chcete získat seznam spuštěných procesů na počítači. Tento příkaz můžete spustit následujícím způsobem.

  1. Vytvořte objekt System.Management.Automation.PowerShell.

    PowerShell ps = PowerShell.Create();
    
  2. Přidejte příkaz, který chcete spustit.

    ps.AddCommand("Get-Process");
    
  3. Vyvolat příkaz .

    ps.Invoke();
    

Pokud metodu zavoláte vícekrát před voláním metody AddCommand System.Management.Automation.PowerShell.Invoke, výsledek prvního příkazu se předá do druhého a tak dále. Pokud nechcete, aby se výsledek předchozího příkazu předal do příkazu, přidejte ho voláním System.Management.Automation.PowerShell. AddStatement .

AddParameter

Předchozí příklad spustí jeden příkaz bez jakýchkoli parametrů. K přidání parametrů do příkazu můžete použít System.Management.Automation.PSCommand. AddParameter Metoda. Například následující kód načte seznam všech procesů, které jsou pojmenovány spuštěné PowerShell na počítači.

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

Další parametry můžete přidat opakovaným AddParameter voláním metody .

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

Slovník názvů parametrů a hodnot můžete přidat také voláním system.Management.Automation.PowerShell. AddParameter s method.

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

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

AddStatement

Dávkování můžete simulovat pomocí System.Management.Automation.PowerShell. AddStatement metoda , která přidá další příkaz na konec kanálu. Následující kód načte seznam spuštěných procesů s názvem a pak získá PowerShell seznam spuštěných služeb.

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

AddScript

Existující skript můžete spustit voláním System.Management.Automation.PowerShell. AddScript Metoda. Následující příklad přidá skript do kanálu a spustí ho. Tento příklad předpokládá, že ve složce již existuje skript MyScript.ps1 s názvem D:\PSScripts .

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

K dispozici je také verze metody AddScript , která přebírá logický parametr s názvem useLocalScope . Pokud je tento parametr nastavený na true , skript se spustí v místním oboru. Následující kód spustí skript v místním oboru.

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

Vytvoření vlastního runspace

I když výchozí runspace použitý v předchozích příkladech načte všechny základní příkazy Windows PowerShell, můžete vytvořit vlastní runspace, který načte pouze zadanou podmnožinu všech příkazů. Můžete to udělat za účelem zvýšení výkonu (načtení většího počtu příkazů je výkon hit), nebo omezit schopnost uživatele provádět operace. Runspace, který zpřístupňuje pouze omezený počet příkazů, se nazývá omezené runspace. K vytvoření omezeného prostředí runspace použijte třídy System.Management.Automation.Runspaces.Runspace a System.Management.Automation.Runspaces.InitialSessionState.

Vytvoření objektu InitialSessionState

Pokud chcete vytvořit vlastní runspace, musíte nejprve vytvořit objekt System.Management.Automation.Runspaces.InitialSessionState. V následujícím příkladu používáme System.Management.Automation.Runspaces.RunspaceFactory k vytvoření runspace po vytvoření výchozího objektu 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();

Omezení prostoru spuštění

V předchozím příkladu jsme vytvořili výchozí objekt System.Management.Automation.Runspaces.InitialSessionState, který načte všechny integrované základní Windows PowerShell. Mohli jsme také volat metodu System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2 pro vytvoření objektu InitialSessionState, který by načítá pouze příkazy v modulu snapin Microsoft.PowerShell.Core. Pokud chcete vytvořit omezenější prostředí runspace, musíte vytvořit prázdný objekt InitialSessionState voláním metody System.Management.Automation.Runspaces.InitialSessionState.Create a pak přidat příkazy do třídy InitialSessionState.

Použití prostředí runspace, které načte pouze příkazy, které zadáte, poskytuje výrazně vyšší výkon.

Metody třídy System.Management.Automation.Runspaces.SessionStateCmdletEntry slouží k definování rutin pro počáteční stav relace. Následující příklad vytvoří prázdný počáteční stav relace a pak definuje a přidá příkazy a Get-Command Import-Module do počátečního stavu relace. Potom vytvoříme prostor runspace omezený tímto počátečním stavem relace a spustíme příkazy v tomto runspace.

Vytvořte počáteční stav relace.

InitialSessionState iss = InitialSessionState.Create();

Definujte a přidejte příkazy do počátečního stavu relace.

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

Vytvořte a otevřete runspace.

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

Spusťte příkaz a zobrazte výsledek.

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

Při spuštění bude výstup tohoto kódu vypadat takto.

Get-Command
Import-Module