Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Nach dem Erstellen eines Runspaces können Sie einer Pipeline Windows PowerShell-Befehle und -Skripts hinzufügen und dann die Pipeline synchron oder asynchron aufrufen.
Erstellen einer Pipeline
Die System.Management.Automation.PowerShell Klasse stellt mehrere Methoden zum Hinzufügen von Befehlen, Parametern und Skripts zur Pipeline bereit. Sie können die Pipeline synchron aufrufen, indem Sie eine Überladung der System.Management.Automation.PowerShell.Invoke*-Methode aufrufen oder asynchron eine Überladung der System.Management.Automation.PowerShell.BeginInvoke* und dann die System.Management.Automation.PowerShell.EndInvoke*-Methode aufrufen.
AddCommand
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 System.Management.Automation.PowerShell.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 senden möchten, fügen Sie ihn hinzu, indem Sie stattdessen die System.Management.Automation.PowerShell.AddStatement* aufrufen.
AddParameter
Im vorherigen Beispiel wird ein einzelner Befehl ohne Parameter ausgeführt. Sie können dem Befehl Parameter hinzufügen, indem Sie die System.Management.Automation.PSCommand.AddParameter* Methode verwenden. 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 System.Management.Automation.PSCommand.AddParameter* wiederholt aufrufen.
PowerShell.Create().AddCommand("Get-Command")
.AddParameter("Name", "Get-VM")
.AddParameter("Module", "Hyper-V")
.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("Name", "Get-VM");
parameters.Add("Module", "Hyper-V");
PowerShell.Create().AddCommand("Get-Command")
.AddParameters(parameters)
.Invoke()
AddStatement
Sie können batching simulieren, indem Sie die System.Management.Automation.PowerShell.AddStatement* Methode verwenden, die am Ende der Pipeline eine zusätzliche Anweisung hinzufügt. Der folgende Code ruft eine Liste der ausgeführten Prozesse mit dem Namen powershellab 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.AddScript*-Methode aufrufen. 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:\PSScriptsvorhanden ist.
PowerShell ps = PowerShell.Create();
ps.AddScript(File.ReadAllText(@"D:\PSScripts\MyScript.ps1")).Invoke();
Es gibt auch eine Version der System.Management.Automation.PowerShell.AddScript*-Methode, die einen booleschen Parameter namens useLocalScopeverwendet. Wenn dieser Parameter auf truefestgelegt 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(File.ReadAllText(@"D:\PSScripts\MyScript.ps1"), true).Invoke();
Synchrones Aufrufen einer Pipeline
Nachdem Sie der Pipeline Elemente hinzugefügt haben, rufen Sie sie auf. Um die Pipeline synchron aufzurufen, rufen Sie eine Überladung der System.Management.Automation.PowerShell.Invoke*-Methode auf. Das folgende Beispiel zeigt, wie eine Pipeline synchron aufgerufen wird.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
namespace HostPS1e
{
class HostPS1e
{
static void Main(string[] args)
{
// Using the PowerShell.Create and AddCommand
// methods, create a command pipeline.
PowerShell ps = PowerShell.Create().AddCommand ("Sort-Object");
// Using the PowerShell.Invoke method, run the command
// pipeline using the supplied input.
foreach (PSObject result in ps.Invoke(new int[] { 3, 1, 6, 2, 5, 4 }))
{
Console.WriteLine("{0}", result);
} // End foreach.
} // End Main.
} // End HostPS1e.
}
Asynchrones Aufrufen einer Pipeline
Sie rufen asynchron eine Pipeline auf, indem Sie eine Überladung der System.Management.Automation.PowerShell.BeginInvoke* aufrufen, um ein IAsyncResult--Objekt zu erstellen und dann die System.Management.Automation.PowerShell.EndInvoke*-Methode aufzurufen.
Das folgende Beispiel zeigt, wie eine Pipeline asynchron aufgerufen wird.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management.Automation;
namespace HostPS3
{
class HostPS3
{
static void Main(string[] args)
{
// Use the PowerShell.Create and PowerShell.AddCommand
// methods to create a command pipeline that includes
// Get-Process cmdlet. Do not include spaces immediately
// before or after the cmdlet name as that will cause
// the command to fail.
PowerShell ps = PowerShell.Create().AddCommand("Get-Process");
// Create an IAsyncResult object and call the
// BeginInvoke method to start running the
// command pipeline asynchronously.
IAsyncResult asyncpl = ps.BeginInvoke();
// Using the PowerShell.Invoke method, run the command
// pipeline using the default runspace.
foreach (PSObject result in ps.EndInvoke(asyncpl))
{
Console.WriteLine("{0,-20}{1}",
result.Members["ProcessName"].Value,
result.Members["Id"].Value);
} // End foreach.
System.Console.WriteLine("Hit any key to exit.");
System.Console.ReadKey();
} // End Main.
} // End HostPS3.
}