Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se explica cómo crear un proveedor de Windows PowerShell que tenga la funcionalidad básica de crear una nueva unidad. Para obtener información general sobre los proveedores, consulte Información general del proveedor de Windows PowerShell. Para obtener ejemplos de proveedores con funcionalidad más completa, consulte ejemplos de proveedor de .
Escritura de un proveedor básico
La funcionalidad más básica de un proveedor de Windows PowerShell es crear y quitar unidades. En este ejemplo, se implementan 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 de AccessDBProviderSample02, que forma parte de un ejemplo más grande que representa una base de datos de Access como una unidad de Windows PowerShell.
Configuración del proyecto
En Visual Studio, cree un proyecto de biblioteca de clases denominado AccessDBProviderSample. Complete los pasos siguientes para configurar el proyecto para que Se inicie Windows PowerShell y el proveedor se cargará en la sesión, al compilar e iniciar el proyecto.
Configuración del proyecto de proveedor
Agregue el ensamblado System.Management.Automation como referencia al proyecto.
Haga clic en Project > AccessDBProviderSample Properties > Depurar. En Iniciar proyecto, haga clic en Iniciar programa externoy vaya al ejecutable de Windows PowerShell (normalmente C:\Windows\System32\WindowsPowerShell\v1.0\.powershell.exe).
En Opciones de inicio, escriba lo siguiente en el cuadro Argumentos de línea de comandos:
-NoExit -Command "[Reflection.Assembly]::LoadFrom(AccessDBProviderSample.dll' ) | Import-Module"
Declaración de 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, navegación por el almacén de datos y obtención y configuración de 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 el System.Management.Automation.Provider.CmdletProviderAttribu te 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 motor de Windows PowerShell. Este método debe declararse dentro de la clase creada anteriormente.
En primer lugar, el método comprueba que tanto el objeto de unidad como la raíz de la unidad que se pasaron existen, devolviendo null
si 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;
}