Opdrachten toevoegen en aanroepen
Nadat u een runspace hebt gemaakt, kunt u Windows PowerShell-opdrachten en -scripts toevoegen aan een pijplijn en vervolgens de pijplijn synchroon of asynchroon aanroepen.
Een pijplijn maken
De klasse System.Management.Automation.PowerShell biedt verschillende methoden voor het toevoegen van opdrachten, parameters en scripts aan de pijplijn. U kunt de pijplijn synchroon aanroepen door een overbelasting aan te roepen van de methode System.Management.Automation.PowerShell.Invoke* of asynchroon door een overbelasting aan te roepen van de System.Management.Automation.PowerShell.BeginInvoke* en vervolgens de System.Management.Automation.PowerShell.EndInvoke* methode.
AddCommand
Maak een System.Management.Automation.PowerShell-object.
PowerShell ps = PowerShell.Create();
Voeg de opdracht toe die u wilt uitvoeren.
ps.AddCommand("Get-Process");
Roep de opdracht aan.
ps.Invoke();
Als u de methode System.Management.Automation.PowerShell.AddCommand* meer dan één keer aanroept voordat u de methode System.Management.Automation.PowerShell.Invoke* aanroept, wordt het resultaat van de eerste opdracht doorgesluisd naar de tweede, enzovoort. Als u het resultaat van een vorige opdracht niet wilt doorsluisen naar een opdracht, voegt u deze toe door in plaats daarvan de System.Management.Automation.PowerShell.AddStatement* aan te roepen.
AddParameter
In het vorige voorbeeld wordt één opdracht uitgevoerd zonder parameters. U kunt parameters toevoegen aan de opdracht met behulp van de System.Management.Automation.PSCommand.AddParameter* methode. Met de volgende code wordt bijvoorbeeld een lijst weergegeven met alle processen met de naam powershell
die op de computer worden uitgevoerd.
PowerShell.Create().AddCommand("Get-Process")
.AddParameter("Name", "powershell")
.Invoke();
U kunt extra parameters toevoegen door System.Management.Automation.PSCommand.AddParameter* aan te roepen herhaaldelijk.
PowerShell.Create().AddCommand("Get-Command")
.AddParameter("Name", "Get-VM")
.AddParameter("Module", "Hyper-V")
.Invoke();
U kunt ook een woordenlijst met parameternamen en -waarden toevoegen door de methode System.Management.Automation.PowerShell.AddParameters* aan te roepen.
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
U kunt batchverwerking simuleren met behulp van de methode System.Management.Automation.PowerShell.AddStatement*, waarmee een extra instructie wordt toegevoegd aan het einde van de pijplijn. De volgende code haalt een lijst met actieve processen op met de naam powershell
en haalt vervolgens de lijst met actieve services op.
PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Process").AddParameter("Name", "powershell");
ps.AddStatement().AddCommand("Get-Service");
ps.Invoke();
AddScript
U kunt een bestaand script uitvoeren door de methode System.Management.Automation.PowerShell.AddScript* aan te roepen. In het volgende voorbeeld wordt een script aan de pijplijn toegevoegd en uitgevoerd. In dit voorbeeld wordt ervan uitgegaan dat er al een script is met de naam MyScript.ps1
in een map met de naam D:\PSScripts
.
PowerShell ps = PowerShell.Create();
ps.AddScript(File.ReadAllText(@"D:\PSScripts\MyScript.ps1")).Invoke();
Er is ook een versie van de methode System.Management.Automation.PowerShell.AddScript* die een booleaanse parameter met de naam useLocalScope
gebruikt. Als deze parameter is ingesteld op true
, wordt het script uitgevoerd in het lokale bereik. Met de volgende code wordt het script uitgevoerd in het lokale bereik.
PowerShell ps = PowerShell.Create();
ps.AddScript(File.ReadAllText(@"D:\PSScripts\MyScript.ps1"), true).Invoke();
Een pijplijn synchroon aanroepen
Nadat u elementen aan de pijplijn hebt toegevoegd, roept u deze aan. Als u de pijplijn synchroon wilt aanroepen, roept u een overbelasting aan van de System.Management.Automation.PowerShell.Invoke* methode. In het volgende voorbeeld ziet u hoe u een pijplijn synchroon aanroept.
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.
}
Een pijplijn asynchroon aanroepen
U roept een pijplijn asynchroon aan door een overbelasting aan te roepen van de System.Management.Automation.PowerShell.BeginInvoke* om een IAsyncResult--object te maken en vervolgens de System.Management.Automation.PowerShell.EndInvoke* aan te roepen.
In het volgende voorbeeld ziet u hoe u een pijplijn asynchroon aanroept.
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.
}
Zie ook
Een InitialSessionState- maken