Lägga till och anropa kommandon

När du har skapat ett runspace kan du lägga till Windows PowerShellkommandon och skript till 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 metoden System.Management.Automation.Powershell.Invoke* eller asynkront genom att anropa en överbelastning av metoden System.Management.Automation.Powershell.Begininvoke* och sedan metoden System.Management.Automation.Powershell.Endinvoke*.

Lägg tillKommando

  1. Skapa ett System.Management.Automation.Powershell-objekt.

    PowerShell ps = PowerShell.Create();
    
  2. Lägg till kommandot som du vill köra.

    ps.AddCommand("Get-Process");
    
  3. 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* kommer resultatet av det första kommandot att ledas till det andra och så vidare. Om du inte vill skicka resultatet från 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 metoden System.Management.Automation.Pscommand.Addparameter*. Följande kod hämtar till exempel en lista över alla processer med namnet som körs på PowerShell 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 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 och hämtar sedan listan över tjänster PowerShell 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 MyScript.ps1 namnet 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 true är inställd på 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();

Anrop av 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 anropar en pipeline synkront.

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.
}

Anrop av en pipeline asynkront

Du anropar en pipeline asynkront genom att anropa en överbelastning av system.Management.Automation.Powershell.Begininvoke* för att skapa ett IAsyncResult-objekt och sedan anropa metoden System.Management.Automation.Powershell.Endinvoke*.

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.
}

Se även

Skapa en InitialSessionState

Skapa ett begränsat körningsutrymme