Sdílet prostřednictvím


Rychlý start k hostiteli Windows PowerShellu

K hostování Prostředí 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 prostředí 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í příkazy Windows PowerShellu. Pokud chcete, aby vaše aplikace zpřístupnila pouze podmnožinu příkazů Windows PowerShellu, musíte vytvořit vlastní prostředí runspace.

Poznámka:

Pokud chcete spustit následující ukázky, musíte mít Microsoft.PowerShell.SDK nainstalovaný balíček NuGet.

Použití výchozího prostředí runspace

Abychom mohli začít, použijeme výchozí runspace a použijeme metody System.Management.Automation.PowerShellu třídy k přidání příkazů, parametrů, příkazů a skriptů do kanálu.

AddCommand

Použijete System.Management.Automation.PowerShell.AddCommand metodu 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. Postup spuštění tohoto příkazu je následující.

  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. Vyvolání příkazu

    ps.Invoke();
    

Pokud voláte metodu AddCommand více než jednou předtím, než zavoláte metodu System.Management.Automation.PowerShell.Invoke, výsledek prvního příkazu se předá na druhou metodu atd. Pokud nechcete převést výsledek předchozího příkazu na příkaz, přidejte ho voláním System.Management.Automation.PowerShell.AddStatement.

AddParameter

Předchozí příklad spustí jeden příkaz bez parametrů. K příkazu můžete přidat parametry pomocí System.Management.Automation.PSCommand.AddParameter metoda. Například následující kód získá seznam všech procesů, které jsou pojmenované powershell spuštěné na počítači.

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

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

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

Slovník názvů a hodnot parametrů můžete také přidat voláním metody System.Management.Automation.PowerShell.AddParameters.

var parameters = new Dictionary<string, string>
{
    { "Path", @"C:\Windows" },
    { "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 získá seznam spuštěných procesů s názvem powershella pak získá 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á do kanálu skript a spustí ho. Tento příklad předpokládá, že již existuje skript s názvem MyScript.ps1 ve složce s názvem D:\PSScripts.

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

Existuje také verze AddScript metody, 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 prostředí runspace

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

Vytvoření objektu InitialSessionState

Chcete-li vytvořit vlastní prostředí runspace, musíte nejprve vytvořit System.Management.Automation.Runspaces.InitialSessionState objektu. V následujícím příkladu použijeme 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();

rs.Close();

Omezení prostředí runspace

V předchozím příkladu jsme vytvořili výchozí System.Management.Automation.Runspaces.InitialSessionState objekt, který načte všechny integrované základní prostředí Windows PowerShell. Mohli jsme také volat metodu System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2 vytvořit objekt InitialSessionState, který by načetl pouze příkazy v modulu snapin Microsoft.PowerShell.Core. Chcete-li vytvořit více omezený runspace, musíte vytvořit prázdný InitialSessionState objekt voláním System.Management.Automation.Runspaces.InitialSessionState.Create metoda a pak přidat příkazy do InitialSessionState.

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

Metody System.Management.Automation.Runspaces.SessionStateCmdletEntry třídy slouží k definování rutin pro počáteční stav relace. Následující příklad vytvoří prázdný počáteční stav relace, pak definuje a přidá Get-Command a Import-Module příkazy do počátečního stavu relace. Potom vytvoříme runspace omezený tímto počátečním stavem relace a spustíme příkazy v daném prostředí 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 (CommandInfo entry in result)
{
    Console.WriteLine(entry.Name);
}

Zavřete runspace.

rs.Close();

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

Get-Command
Import-Module