Lägga till och anropa kommandon
När du har skapat en runspace kan du lägga till Windows PowerShell-kommandon och skript i en pipeline och sedan anropa pipelinen synkront eller asynkront.
Skapa en pipeline
Klassen System.Management.Automation.PowerShell innehåller flera metoder för att lägga till kommandon, parametrar och skript i pipelinen. Du kan anropa pipelinen synkront genom att anropa en överlagring av System.Management.Automation.PowerShell.Invoke*-metoden eller asynkront genom att anropa en överlagring av System.Management.Automation.PowerShell.BeginInvoke* och sedan System.Management.Automation.PowerShell.EndInvoke*-metoden.
AddCommand
Skapa ett System.Management.Automation.PowerShell-objekt.
PowerShell ps = PowerShell.Create();
Lägg till det kommando som du vill köra.
ps.AddCommand("Get-Process");
Anropa kommandot.
ps.Invoke();
Om du anropar metoden System.Management.Automation.PowerShell.AddCommand* mer än en gång innan du anropar metoden System.Management.Automation.PowerShell.Invoke* * skickas resultatet av det första kommandot till det andra och så vidare. Om du inte vill skicka resultatet av ett tidigare kommando till ett kommando lägger du till det genom att anropa System.Management.Automation.PowerShell.AddStatement* i stället.
AddParameter
I föregående exempel körs ett enda kommando utan några parametrar. Du kan lägga till parametrar i kommandot med hjälp av System.Management.Automation.PSCommand.AddParameter*-metoden Till exempel hämtar följande kod en lista över alla processer som heter powershell
körs på datorn.
PowerShell.Create().AddCommand("Get-Process")
.AddParameter("Name", "powershell")
.Invoke();
Du kan lägga till ytterligare parametrar genom att anropa System.Management.Automation.PSCommand.AddParameter* upprepade gånger.
PowerShell.Create().AddCommand("Get-Command")
.AddParameter("Name", "Get-VM")
.AddParameter("Module", "Hyper-V")
.Invoke();
Du kan också lägga till en ordlista med parameternamn och värden genom att anropa metoden System.Management.Automation.PowerShell.AddParameters*.
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
Du kan simulera batchbearbetning med hjälp av metoden System.Management.Automation.PowerShell.AddStatement*, som lägger till ytterligare en instruktion i slutet av pipelinen Följande kod hämtar en lista över processer som körs med namnet powershell
och hämtar sedan listan över tjänster som körs.
PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Process").AddParameter("Name", "powershell");
ps.AddStatement().AddCommand("Get-Service");
ps.Invoke();
AddScript
Du kan köra ett befintligt skript genom att anropa metoden System.Management.Automation.PowerShell.AddScript*. I följande exempel läggs ett skript till i pipelinen och körs. Det här exemplet förutsätter att det redan finns ett skript med namnet MyScript.ps1
i en mapp med namnet D:\PSScripts
.
PowerShell ps = PowerShell.Create();
ps.AddScript(File.ReadAllText(@"D:\PSScripts\MyScript.ps1")).Invoke();
Det finns också en version av metoden System.Management.Automation.PowerShell.AddScript* som tar en boolesk parameter med namnet useLocalScope
. Om den här parametern är inställd på true
körs skriptet i det lokala omfånget. Följande kod kör skriptet i det lokala omfånget.
PowerShell ps = PowerShell.Create();
ps.AddScript(File.ReadAllText(@"D:\PSScripts\MyScript.ps1"), true).Invoke();
Anropa en pipeline synkront
När du har lagt till element i pipelinen anropar du den. Om du vill anropa pipelinen synkront anropar du en överlagring av metoden System.Management.Automation.PowerShell.Invoke*. I följande exempel visas hur du synkront anropar en pipeline.
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.
}
Anropa en pipeline asynkront
Du anropar en pipeline asynkront genom att anropa en överlagring av System.Management.Automation.PowerShell.BeginInvoke* för att skapa ett IAsyncResult- objekt och sedan anropa System.Management.Automation.PowerShell.EndInvoke*-metoden.
I följande exempel visas hur du anropar en pipeline asynkront.
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.
}