Przewodnik Szybki start dotyczący hosta programu Windows PowerShell

Aby hostować Windows PowerShell w aplikacji, należy użyć klasy System.Management.Automation.PowerShell. Ta klasa udostępnia metody, które tworzą potok poleceń, a następnie wykonują te polecenia w przestrzeni uruchamiania. Najprostszym sposobem utworzenia aplikacji hosta jest użycie domyślnego miejsca działania. Domyślny obszar działania zawiera wszystkie podstawowe Windows PowerShell polecenia. Jeśli chcesz, aby aplikacja ujawniała tylko podzbiór poleceń Windows PowerShell, musisz utworzyć niestandardowy obszar działania.

Używanie domyślnego miejsca działania

Aby rozpocząć, użyjemy domyślnego środowiska uruchomieniowego i użyjemy metod klasy System.Management.Automation.PowerShell, aby dodać polecenia, parametry, instrukcje i skrypty do potoku.

AddCommand

Należy użyć programu System.Management.Automation.PowerShell. AddCommand metoda dodawania poleceń do potoku. Załóżmy na przykład, że chcesz uzyskać listę uruchomionych procesów na maszynie. Sposób uruchamiania tego polecenia jest następujący.

  1. Utwórz obiekt System.Management.Automation.PowerShell.

    PowerShell ps = PowerShell.Create();
    
  2. Dodaj polecenie, które chcesz wykonać.

    ps.AddCommand("Get-Process");
    
  3. Wywołaj polecenie .

    ps.Invoke();
    

Jeśli metoda zostanie wywołana więcej niż raz przed wywołaniem metody AddCommand System.Management.Automation.PowerShell.Invoke, wynik pierwszego polecenia jest potokowany do drugiego i tak dalej. Jeśli nie chcesz potokować wyniku poprzedniego polecenia do polecenia, dodaj go, wywołując system.Management.Automation.PowerShell. AddStatement zamiast niego.

AddParameter

W poprzednim przykładzie jest wykonywane jedno polecenie bez żadnych parametrów. Parametry można dodać do polecenia za pomocą polecenia System.Management.Automation.PSCommand. AddParameter Metoda. Na przykład poniższy kod pobiera listę wszystkich procesów o nazwach PowerShell uruchomionych na maszynie.

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

Możesz dodać dodatkowe parametry, wielokrotnie AddParameter wywołując metodę .

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

Można również dodać słownik nazw parametrów i wartości, wywołując system.Management.Automation.PowerShell. AddParameter s, metoda .

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

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

AddStatement

Przetwarzanie wsadowe można symulować przy użyciu programu System.Management.Automation.PowerShell. AddStatement metoda , która dodaje dodatkową instrukcje na końcu potoku. Poniższy kod pobiera listę uruchomionych procesów o nazwie , a następnie PowerShell pobiera listę uruchomionych usług.

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

AddScript

Istniejący skrypt można uruchomić, wywołując element System.Management.Automation.PowerShell. AddScript Metoda. Poniższy przykład dodaje skrypt do potoku i uruchamia go. W tym przykładzie założono, że istnieje już skrypt o nazwie MyScript.ps1 w folderze o nazwie D:\PSScripts .

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

Istnieje również wersja metody AddScript , która przyjmuje parametr logiczny o nazwie useLocalScope . Jeśli ten parametr jest ustawiony na true , skrypt jest uruchamiany w zakresie lokalnym. Poniższy kod spowoduje uruchomienie skryptu w zakresie lokalnym.

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

Tworzenie niestandardowego miejsca działania

Podczas gdy domyślny obszar działania używany w poprzednich przykładach ładuje wszystkie podstawowe polecenia Windows PowerShell, można utworzyć niestandardowy obszar działania, który ładuje tylko określony podzbiór wszystkich poleceń. Można to zrobić w celu zwiększenia wydajności (ładowanie większej liczby poleceń jest trafieniem w wydajności) lub ograniczenie możliwości wykonywania operacji przez użytkownika. Obszar działania, który uwidacznia tylko ograniczoną liczbę poleceń, jest nazywany ograniczonym obszarem działania. Aby utworzyć ograniczoną przestrzeń działania, należy użyć klas System.Management.Automation.Runspaces.Runspace i System.Management.Automation.Runspaces.InitialSessionState.

Tworzenie obiektu InitialSessionState

Aby utworzyć niestandardowy obszar działania, należy najpierw utworzyć obiekt System.Management.Automation.Runspaces.InitialSessionState. W poniższym przykładzie używamy obiektu System.Management.Automation.Runspaces.RunspaceFactory do utworzenia przestrzeni uruchamiania po utworzeniu domyślnego obiektu 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();

Ograniczanie przestrzeni uruchamiania

W poprzednim przykładzie utworzono domyślny obiekt System.Management.Automation.Runspaces.InitialSessionState, który ładuje wszystkie wbudowane podstawowe Windows PowerShell. Można również nazwać metodę System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2, aby utworzyć obiekt InitialSessionState, który będzie ładować tylko polecenia w przyciągce Microsoft.PowerShell.Core. Aby utworzyć bardziej ograniczony obszar działania, należy utworzyć pusty obiekt InitialSessionState, wywołując metodę System.Management.Automation.Runspaces.InitialSessionState.Create, a następnie dodać polecenia do właściwości InitialSessionState.

Użycie przestrzeni działania, która ładuje tylko określone polecenia, zapewnia znacznie lepszą wydajność.

Metody klasy System.Management.Automation.Runspaces.SessionStateCmdletEntry są stosowane do definiowania polecenia cmdlet dla początkowego stanu sesji. Poniższy przykład tworzy pusty stan sesji początkowej, a następnie definiuje i dodaje polecenia Get-Command i do stanu sesji Import-Module początkowej. Następnie utworzymy obszar działania ograniczony przez ten początkowy stan sesji i wykonamy polecenia w tym przestrzeni uruchamiania.

Utwórz stan sesji początkowej.

InitialSessionState iss = InitialSessionState.Create();

Zdefiniuj polecenia i dodaj je do stanu sesji początkowej.

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

Utwórz i otwórz obszar działania.

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

Wykonaj polecenie i wyświetl wynik.

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

Po uruchomieniu dane wyjściowe tego kodu będą wyglądać następująco.

Get-Command
Import-Module