Schnellstart für Windows PowerShell-Host
Um Windows PowerShell in Ihrer Anwendung zu hosten, verwenden Sie die System.Management.Automation.PowerShell Klasse. Diese Klasse stellt Methoden bereit, die eine Pipeline von Befehlen erstellen und diese Befehle dann in einem Runspace ausführen. Die einfachste Möglichkeit zum Erstellen einer Hostanwendung besteht darin, den Standard-Runspace zu verwenden. Der Standardmäßige Runspace enthält alle wichtigen Windows PowerShell-Befehle. Wenn Ihre Anwendung nur eine Teilmenge der Windows PowerShell-Befehle verfügbar machen soll, müssen Sie einen benutzerdefinierten Runspace erstellen.
Verwenden des Standardmäßigen Runspaces
Zunächst verwenden wir den Standard-Runspace und verwenden die Methoden der System.Management.Automation.PowerShell Klasse, um einer Pipeline Befehle, Parameter, Anweisungen und Skripts hinzuzufügen.
AddCommand
Sie verwenden die System.Management.Automation.PowerShell.AddCommand Methode zum Hinzufügen von Befehlen zur Pipeline. Angenommen, Sie möchten die Liste der ausgeführten Prozesse auf dem Computer abrufen. Die Möglichkeit, diesen Befehl auszuführen, ist wie folgt.
Erstellen Sie ein System.Management.Automation.PowerShell-Objekt.
PowerShell ps = PowerShell.Create();
Fügen Sie den Befehl hinzu, den Sie ausführen möchten.
ps.AddCommand("Get-Process");
Rufen Sie den Befehl auf.
ps.Invoke();
Wenn Sie die AddCommand-Methode mehrmals aufrufen, bevor Sie die System.Management.Automation.PowerShell.Invoke-Methode aufrufen, wird das Ergebnis des ersten Befehls an die zweite usw. weitergeleitet. Wenn Sie das Ergebnis eines vorherigen Befehls nicht an einen Befehl weiterleiten möchten, fügen Sie ihn hinzu, indem Sie die System.Management.Automation.PowerShell aufrufen. stattdessenAddStatement.
AddParameter
Im vorherigen Beispiel wird ein einzelner Befehl ohne Parameter ausgeführt. Sie können dem Befehl Parameter hinzufügen, indem Sie den System.Management.Automation.PSCommand verwenden.AddParameter Methode. Der folgende Code ruft beispielsweise eine Liste aller Prozesse ab, die powershell
auf dem Computer ausgeführt werden.
PowerShell.Create().AddCommand("Get-Process")
.AddParameter("Name", "powershell")
.Invoke();
Sie können zusätzliche Parameter hinzufügen, indem Sie die AddParameter Methode wiederholt aufrufen.
PowerShell.Create().AddCommand("Get-ChildItem")
.AddParameter("Path", @"C:\Windows")
.AddParameter("Filter", "*.exe")
.Invoke();
Sie können auch ein Wörterbuch mit Parameternamen und Werten hinzufügen, indem Sie die System.Management.Automation.PowerShell.AddParameters-Methode aufrufen.
IDictionary parameters = new Dictionary<String, String>();
parameters.Add("Path", @"C:\Windows");
parameters.Add("Filter", "*.exe");
PowerShell.Create().AddCommand("Get-Process")
.AddParameters(parameters)
.Invoke()
AddStatement
Sie können die Batchverarbeitung mithilfe der System.Management.Automation.PowerShell simulieren.AddStatement Methode, die am Ende der Pipeline eine zusätzliche Anweisung hinzufügt. Der folgende Code ruft eine Liste der ausgeführten Prozesse mit dem Namen powershell
ab und ruft dann die Liste der ausgeführten Dienste ab.
PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Process").AddParameter("Name", "powershell");
ps.AddStatement().AddCommand("Get-Service");
ps.Invoke();
AddScript
Sie können ein vorhandenes Skript ausführen, indem Sie die System.Management.Automation.PowerShell aufrufen.AddScript Methode. Im folgenden Beispiel wird der Pipeline ein Skript hinzugefügt und ausgeführt. In diesem Beispiel wird davon ausgegangen, dass bereits ein Skript mit dem Namen MyScript.ps1
in einem Ordner mit dem Namen D:\PSScripts
vorhanden ist.
PowerShell ps = PowerShell.Create();
ps.AddScript("D:\PSScripts\MyScript.ps1").Invoke();
Es gibt auch eine Version der AddScript-Methode, die einen booleschen Parameter mit dem Namen useLocalScope
verwendet. Wenn dieser Parameter auf true
festgelegt ist, wird das Skript im lokalen Bereich ausgeführt. Der folgende Code führt das Skript im lokalen Bereich aus.
PowerShell ps = PowerShell.Create();
ps.AddScript(@"D:\PSScripts\MyScript.ps1", true).Invoke();
Erstellen eines benutzerdefinierten Runspaces
Während der in den vorherigen Beispielen verwendete Standardlaufbereich alle kernigen Windows PowerShell-Befehle lädt, können Sie einen benutzerdefinierten Runspace erstellen, der nur eine angegebene Teilmenge aller Befehle lädt. Möglicherweise möchten Sie dies tun, um die Leistung zu verbessern (das Laden einer größeren Anzahl von Befehlen ist ein Leistungstreffer), oder um die Funktion des Benutzers zum Ausführen von Vorgängen einzuschränken. Ein Runspace, der nur eine begrenzte Anzahl von Befehlen verfügbar macht, wird als eingeschränkter Runspace bezeichnet. Um einen eingeschränkten Runspace zu erstellen, verwenden Sie die System.Management.Automation.Runspaces.Runspace und System.Management.Automation.Runspaces.InitialSessionState Klassen.
Erstellen eines InitialSessionState-Objekts
Um einen benutzerdefinierten Runspace zu erstellen, müssen Sie zuerst ein System.Management.Automation.Runspaces.InitialSessionState-Objekt erstellen. Im folgenden Beispiel verwenden wir die System.Management.Automation.Runspaces.RunspaceFactory-, um nach dem Erstellen eines Standardmäßigen InitialSessionState-Objekts einen Runspace zu erstellen.
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();
Einschränken des Runspaces
Im vorherigen Beispiel haben wir ein Standardobjekt System.Management.Automation.Runspaces.InitialSessionState-Objekt erstellt, das alle integrierten Windows PowerShell-Kernobjekte lädt. Wir könnten auch die System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2-Methode aufgerufen haben, um ein InitialSessionState-Objekt zu erstellen, das nur die Befehle im Microsoft.PowerShell.Core-Snapin laden würde. Um einen eingeschränkteren Runspace zu erstellen, müssen Sie ein leeres InitialSessionState-Objekt erstellen, indem Sie die System.Management.Automation.Runspaces.InitialSessionState.Create-Methode aufrufen und dann Befehle zum InitialSessionState hinzufügen.
Wenn Sie einen Runspace verwenden, der nur die von Ihnen angegebenen Befehle lädt, bietet eine deutlich verbesserte Leistung.
Sie verwenden die Methoden der System.Management.Automation.Runspaces.SessionStateCmdletEntry Klasse, um Cmdlets für den anfänglichen Sitzungszustand zu definieren. Im folgenden Beispiel wird ein leerer anfangser Sitzungszustand erstellt. Anschließend werden die befehle Get-Command
und Import-Module
dem anfänglichen Sitzungszustand hinzugefügt. Anschließend erstellen wir einen durch diesen anfänglichen Sitzungszustand eingeschränkten Runspace und führen die Befehle in diesem Runspace aus.
Erstellen Sie den anfänglichen Sitzungszustand.
InitialSessionState iss = InitialSessionState.Create();
Definieren und Hinzufügen von Befehlen zum anfänglichen Sitzungszustand.
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);
Erstellen und öffnen Sie den Runspace.
Runspace rs = RunspaceFactory.CreateRunspace(iss);
rs.Open();
Führen Sie einen Befehl aus, und zeigen Sie das Ergebnis an.
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);
}
Schließen Sie den Runspace.
rs.Close();
Wenn sie ausgeführt wird, sieht die Ausgabe dieses Codes wie folgt aus.
Get-Command
Import-Module