Inicio rápido de Proveedor de Windows PowerShell

En este tema se explica cómo crear un Windows PowerShell que tenga la funcionalidad básica de crear una nueva unidad. Para obtener información general sobre los proveedores, vea Windows PowerShell Provider Overview. Para obtener ejemplos de proveedores con una funcionalidad más completa, vea Ejemplos de proveedores.

Escritura de un proveedor básico

La funcionalidad más básica de un proveedor Windows PowerShell es crear y quitar unidades. En este ejemplo, implementamos los métodos System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* y System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* de la clase System.Management.Automation.Provider.Drivecmdletprovider. También verá cómo declarar una clase de proveedor.

Al escribir un proveedor, puede especificar unidades de disco predeterminadas que se crean automáticamente cuando el proveedor está disponible. También se define un método para crear nuevas unidades que usan ese proveedor.

Los ejemplos proporcionados en este tema se basan en el ejemplo AccessDBProviderSample02, que forma parte de un ejemplo mayor que representa una base de datos de Access como una Windows PowerShell de datos.

Configuración del proyecto

En Visual Studio, cree un proyecto de biblioteca de clases denominado AccessDBProviderSample. Complete los pasos siguientes para configurar el proyecto de modo que Windows PowerShell se inicie y el proveedor se cargará en la sesión, al compilar e iniciar el proyecto.

Configuración del proyecto de proveedor
  1. Agregue el ensamblado System.Management.Automation como referencia al proyecto.

  2. Haga clic Project > en Propiedades de AccessDBProviderSample > Depurar. En Proyecto de inicio , haga clic en Iniciar programa externo y vaya al archivo ejecutable de Windows PowerShell (normalmente c:\Windows\System32\WindowsPowerShell\v1.0 \ .powershell.exe).

  3. En Opciones de inicio, escriba lo siguiente en el cuadro Argumentos de la línea de comandos: -noexit -command "[reflection.assembly]::loadFrom(AccessDBProviderSample.dll' ) | import-module"

Declarar la clase de proveedor

Nuestro proveedor deriva de la clase System.Management.Automation.Provider.Drivecmdletprovider. La mayoría de los proveedores que proporcionan funcionalidad real (acceso y manipulación de elementos, navegar por el almacén de datos y obtener y establecer contenido de elementos) derivan de la clase System.Management.Automation.Provider.Navigationcmdletprovider.

Además de especificar que la clase deriva de System.Management.Automation.Provider.Drivecmdletprovider,debe decorarla con System.Management.Automation.Provider.Cmdletproviderattribute como se muestra en el ejemplo.

namespace Microsoft.Samples.PowerShell.Providers
{
  using System;
  using System.Data;
  using System.Data.Odbc;
  using System.IO;
  using System.Management.Automation;
  using System.Management.Automation.Provider;

  #region AccessDBProvider

  [CmdletProvider("AccessDB", ProviderCapabilities.None)]
  public class AccessDBProvider : DriveCmdletProvider
  {

}
}

Implementación de NewDrive

El motor de Windows PowerShell llama al método System.Management.Automation.Provider.Drivecmdletprovider.Newdrive* cuando un usuario llama al cmdlet Microsoft.PowerShell.Commands.NewPSDriveCommand especificando el nombre del proveedor. El motor de Windows PowerShell pasa el parámetro PSDriveInfo y el método devuelve la nueva unidad al Windows PowerShell motor. Este método debe declararse dentro de la clase creada anteriormente.

El método comprueba primero si existe el objeto de unidad y la raíz de la unidad que se pasaron, devolviendo si null alguno de ellos no lo hace. A continuación, usa un constructor de la clase interna AccessDBPSDriveInfo para crear una nueva unidad y una conexión a la base de datos de Access que representa la unidad.

protected override PSDriveInfo NewDrive(PSDriveInfo drive)
    {
      // Check if the drive object is null.
      if (drive == null)
      {
        WriteError(new ErrorRecord(
                   new ArgumentNullException("drive"),
                   "NullDrive",
                   ErrorCategory.InvalidArgument,
                   null));

        return null;
      }

      // Check if the drive root is not null or empty
      // and if it is an existing file.
      if (String.IsNullOrEmpty(drive.Root) || (File.Exists(drive.Root) == false))
      {
        WriteError(new ErrorRecord(
                   new ArgumentException("drive.Root"),
                   "NoRoot",
                   ErrorCategory.InvalidArgument,
                   drive));

        return null;
      }

      // Create a new drive and create an ODBC connection to the new drive.
      AccessDBPSDriveInfo accessDBPSDriveInfo = new AccessDBPSDriveInfo(drive);
      OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

      builder.Driver = "Microsoft Access Driver (*.mdb)";
      builder.Add("DBQ", drive.Root);

      OdbcConnection conn = new OdbcConnection(builder.ConnectionString);
      conn.Open();
      accessDBPSDriveInfo.Connection = conn;

      return accessDBPSDriveInfo;
    }

A continuación se muestra la clase interna AccessDBPSDriveInfo que incluye el constructor usado para crear una nueva unidad y contiene la información de estado de la unidad.

internal class AccessDBPSDriveInfo : PSDriveInfo
  {
    /// <summary>
    /// A reference to the connection to the database.
    /// </summary>
    private OdbcConnection connection;

    /// <summary>
    /// Initializes a new instance of the AccessDBPSDriveInfo class.
    /// The constructor takes a single argument.
    /// </summary>
    /// <param name="driveInfo">Drive defined by this provider</param>
    public AccessDBPSDriveInfo(PSDriveInfo driveInfo)
           : base(driveInfo)
    {
    }

    /// <summary>
    /// Gets or sets the ODBC connection information.
    /// </summary>
    public OdbcConnection Connection
    {
        get { return this.connection; }
        set { this.connection = value; }
    }
  }

Implementación de RemoveDrive

El motor de Windows PowerShell llama al método System.Management.Automation.Provider.Drivecmdletprovider.Removedrive* cuando un usuario llama al cmdlet Microsoft.PowerShell.Commands.RemovePSDriveCommand. El método de este proveedor cierra la conexión a la base de datos de Access.

protected override PSDriveInfo RemoveDrive(PSDriveInfo drive)
    {
      // Check if drive object is null.
      if (drive == null)
      {
        WriteError(new ErrorRecord(
                   new ArgumentNullException("drive"),
                   "NullDrive",
                   ErrorCategory.InvalidArgument,
                   drive));

        return null;
      }

      // Close the ODBC connection to the drive.
      AccessDBPSDriveInfo accessDBPSDriveInfo = drive as AccessDBPSDriveInfo;

      if (accessDBPSDriveInfo == null)
      {
         return null;
      }

      accessDBPSDriveInfo.Connection.Close();

      return accessDBPSDriveInfo;
    }