Compartir a través de


Inicio rápido del host de Windows PowerShell

Para hospedar Windows PowerShell en la aplicación, use la clase System.Management.Automation.PowerShell. Esta clase proporciona métodos que crean una canalización de comandos y, a continuación, ejecutan esos comandos en un espacio de ejecución. La manera más sencilla de crear una aplicación host es usar el espacio de ejecución predeterminado. El espacio de ejecución predeterminado contiene todos los comandos principales de Windows PowerShell. Si desea que la aplicación exponga solo un subconjunto de los comandos de Windows PowerShell, debe crear un espacio de ejecución personalizado.

Uso del espacio de ejecución predeterminado

Para empezar, usaremos el espacio de ejecución predeterminado y usaremos los métodos de la clase System.Management.Automation.PowerShell para agregar comandos, parámetros, instrucciones y scripts a una canalización.

AddCommand

Use el System.Management.Automation.PowerShell.AddCommand método para agregar comandos a la canalización. Por ejemplo, supongamos que desea obtener la lista de procesos en ejecución en la máquina. La manera de ejecutar este comando es la siguiente.

  1. Cree un objeto System.Management.Automation.PowerShell.

    PowerShell ps = PowerShell.Create();
    
  2. Agregue el comando que desea ejecutar.

    ps.AddCommand("Get-Process");
    
  3. Invoque el comando .

    ps.Invoke();
    

Si llama al método AddCommand más de una vez antes de llamar al método System.Management.Automation.PowerShell.Invoke, el resultado del primer comando se canaliza al segundo, etc. Si no desea canalizar el resultado de un comando anterior a un comando, agréguelo llamando al System.Management.Automation.PowerShell.AddStatement en su lugar.

AddParameter

En el ejemplo anterior se ejecuta un único comando sin parámetros. Puede agregar parámetros al comando mediante el System.Management.Automation.PSCommand. métodoAddParameter. Por ejemplo, el código siguiente obtiene una lista de todos los procesos denominados powershell que se ejecutan en la máquina.

PowerShell.Create().AddCommand("Get-Process")
                   .AddParameter("Name", "powershell")
                   .Invoke();

Puede agregar parámetros adicionales llamando al método AddParameter repetidamente.

PowerShell.Create().AddCommand("Get-ChildItem")
                   .AddParameter("Path", @"C:\Windows")
                   .AddParameter("Filter", "*.exe")
                   .Invoke();

También puede agregar un diccionario de nombres de parámetros y valores llamando al método system.Management.Automation.PowerShell.AddParameters.

IDictionary parameters = new Dictionary<String, String>();
parameters.Add("Path", @"C:\Windows");
parameters.Add("Filter", "*.exe");

PowerShell.Create().AddCommand("Get-Process")
   .AddParameters(parameters)
      .Invoke()

AddStatement

Puede simular el procesamiento por lotes mediante el System.Management.Automation.PowerShell.AddStatement método, que agrega una instrucción adicional al final de la canalización. El código siguiente obtiene una lista de procesos en ejecución con el nombre powershelly, a continuación, obtiene la lista de servicios en ejecución.

PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-Process").AddParameter("Name", "powershell");
ps.AddStatement().AddCommand("Get-Service");
ps.Invoke();

AddScript

Puede ejecutar un script existente mediante una llamada a System.Management.Automation.PowerShell de . métodoAddScript. En el ejemplo siguiente se agrega un script a la canalización y se ejecuta. En este ejemplo se supone que ya hay un script denominado MyScript.ps1 en una carpeta denominada D:\PSScripts.

PowerShell ps = PowerShell.Create();
ps.AddScript("D:\PSScripts\MyScript.ps1").Invoke();

También hay una versión del método AddScript que toma un parámetro booleano denominado useLocalScope. Si este parámetro se establece en true, el script se ejecuta en el ámbito local. El código siguiente ejecutará el script en el ámbito local.

PowerShell ps = PowerShell.Create();
ps.AddScript(@"D:\PSScripts\MyScript.ps1", true).Invoke();

Creación de un espacio de ejecución personalizado

Aunque el espacio de ejecución predeterminado usado en los ejemplos anteriores carga todos los comandos principales de Windows PowerShell, puede crear un espacio de ejecución personalizado que cargue solo un subconjunto especificado de todos los comandos. Es posible que quiera hacerlo para mejorar el rendimiento (cargar un mayor número de comandos es un éxito de rendimiento) o restringir la capacidad del usuario para realizar operaciones. Un espacio de ejecución que expone solo un número limitado de comandos se denomina espacio de ejecución restringido. Para crear un espacio de ejecución restringido, use las clases System.Management.Automation.Runspaces.Runspace y System.Management.Automation.Runspaces.InitialSessionState.

Creación de un objeto InitialSessionState

Para crear un espacio de ejecución personalizado, primero debe crear un objeto System.Management.Automation.Runspaces.InitialSessionState. En el ejemplo siguiente, usamos el System.Management.Automation.Runspaces.RunspaceFactory para crear un espacio de ejecución después de crear un objeto InitialSessionState predeterminado.

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();

Restricción del espacio de ejecución

En el ejemplo anterior, creamos un objeto predeterminado System.Management.Automation.Runspaces.InitialSessionState que carga todos los núcleos integrados de Windows PowerShell. También podríamos haber llamado al método System.Management.Automation.Runspaces.InitialSessionState.CreateDefault2 para crear un objeto InitialSessionState que cargaría solo los comandos en el complemento Microsoft.PowerShell.Core. Para crear un espacio de ejecución más restringido, debe crear un objeto InitialSessionState vacío llamando al método System.Management.Automation.Runspaces.InitialSessionState.Create y, a continuación, agregar comandos a InitialSessionState.

El uso de un espacio de ejecución que carga solo los comandos que especifique proporciona un rendimiento mejorado significativamente.

Use los métodos de la clase System.Management.Automation.Runspaces.SessionStateCmdletEntry para definir cmdlets para el estado de sesión inicial. En el ejemplo siguiente se crea un estado de sesión inicial vacío y, a continuación, se definen y se agregan los comandos Get-Command y Import-Module al estado de sesión inicial. A continuación, creamos un espacio de ejecución restringido por ese estado de sesión inicial y ejecutamos los comandos en ese espacio de ejecución.

Cree el estado de sesión inicial.

InitialSessionState iss = InitialSessionState.Create();

Defina y agregue comandos al estado de sesión inicial.

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);

Cree y abra el espacio de ejecución.

Runspace rs = RunspaceFactory.CreateRunspace(iss);
rs.Open();

Ejecute un comando y muestre el resultado.

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);
}

Cierre el espacio de ejecución.

rs.Close();

Cuando se ejecuta, la salida de este código tendrá el siguiente aspecto.

Get-Command
Import-Module