Compartir a través de


Creando un proveedor de navegación PowerShell para Windows

Este tema describe cómo crear un proveedor de navegación PowerShell para Windows que pueda navegar por el almacén de datos. Este tipo de proveedor soporta comandos recursivos, contenedores anidados y rutas relativas.

Nota:

Puedes descargar el archivo fuente (AccessDBSampleProvider05.cs) en C# de este proveedor utilizando el Microsoft Windows Software Development Kit para Windows Vista y los componentes de ejecución de .NET Framework 3.0. Para las instrucciones de descarga, consulta Cómo instalar Windows PowerShell y descargar el SDK de Windows PowerShell. Los archivos fuente descargados están disponibles en el <directorio de Ejemplos> de PowerShell. Para más información sobre otras implementaciones de proveedores de Windows PowerShell, consulte Diseñando su proveedor de PowerShell para Windows.

El proveedor descrito aquí permite al usuario gestionar una base de datos Access como una unidad para que pueda navegar a las tablas de datos de la base de datos. Al crear tu propio proveedor de navegación, puedes implementar métodos que permitan crear rutas calificadas para la unidad necesarias para la navegación, normalizar rutas relativas, mover elementos del almacén de datos, así como métodos que obtengan nombres hijos, obtengan la ruta padre de un elemento y prueben si un elemento es un contenedor.

Precaución

Ten en cuenta que este diseño asume una base de datos que tiene un campo con el ID del nombre, y que el tipo del campo es LongInteger.

Defina el proveedor PowerShell de Windows

Un proveedor de navegación PowerShell de Windows debe crear una clase .NET que derive de la clase base System.Management.Automation.Provider.NavigationCmdletProvider . Aquí está la definición de clase para el proveedor de navegación descrito en esta sección.

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

Ten en cuenta que en este proveedor, el atributo System.Management.Automation.Provider.CmdletProviderAttribute incluye dos parámetros. El primer parámetro especifica un nombre fácil de usar para el proveedor que utiliza Windows PowerShell. El segundo parámetro especifica las capacidades específicas de PowerShell de Windows que el proveedor expone al entorno de ejecución de Windows PowerShell durante el procesamiento de comandos. Para este proveedor, no se añaden capacidades específicas de PowerShell de Windows.

Definición de la funcionalidad base

Como se describe en Design Your PS Provider, la clase base System.Management.Automation.Provider.NavigationCmdletProvider deriva de varias otras clases que proporcionaban diferentes funcionalidades de proveedores. Por tanto, un proveedor de navegación Windows PowerShell debe definir toda la funcionalidad proporcionada por esas clases.

Para implementar funcionalidades para añadir información de inicialización específica de la sesión y para liberar recursos que utiliza el proveedor, consulte Creación de un proveedor básico de PS. Sin embargo, la mayoría de los proveedores (incluido el que se describe aquí) pueden utilizar la implementación predeterminada de esta funcionalidad proporcionada por Windows PowerShell.

Para acceder al almacén de datos a través de una unidad PowerShell de Windows, debes implementar los métodos de la clase base System.Management.Automation.Provider.DriveCmdletProvider . Para más información sobre cómo implementar estos métodos, consulte Creación de un proveedor de unidades PowerShell para Windows.

Para manipular los elementos de un almacén de datos, como obtener, configurar y compensar elementos, el proveedor debe implementar los métodos proporcionados por la clase base System.Management.Automation.Provider.ItemCmdletProvider . Para más información sobre cómo implementar estos métodos, consulte Creación de un proveedor de elementos para Windows PowerShell.

Para acceder a los elementos hijos, o sus nombres, del almacén de datos, así como a los métodos que crean, copian, renombran y eliminan elementos, debes implementar los métodos proporcionados por la clase base System.Management.Automation.Provider.ContainerCmdletProvider . Para más información sobre cómo implementar estos métodos, consulte Creación de un proveedor de contenedores para Windows PowerShell.

Creación de una ruta PowerShell para Windows

El proveedor de navegación Windows PowerShell utiliza una ruta interna de Windows PowerShell para navegar por los elementos del almacén de datos. Para crear una ruta interna al proveedor, el proveedor debe implementar el método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* para soportar llamadas desde el cmdlet Combine-Path. Este método combina una ruta padre e hija en una ruta interna del proveedor, utilizando un separador de rutas específico del proveedor entre las rutas padre e hija.

La implementación predeterminada toma caminos con "/" o "\" como separador de caminos, normaliza el separador de caminos a "\", combina las partes padre e hijo con el separador entre ellas, y luego devuelve una cadena que contiene los caminos combinados.

Este proveedor de navegación no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada del método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* .

Cosas a recordar sobre la implementación de MakePath

Las siguientes condiciones pueden aplicarse a tu implementación de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:

  • Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* no debería validar la ruta como una ruta legal y totalmente cualificada en el espacio de nombres del proveedor. Ten en cuenta que cada parámetro solo puede representar una parte de un camino, y las partes combinadas pueden no generar un camino completamente cualificado. Por ejemplo, el método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* para el proveedor del Sistema de Archivos podría recibir "windows\system32" en el parent parámetro y "abc.dll" en el child parámetro. El método une estos valores con el separador "\" y devuelve "windows\system32\abc.dll", que no es una ruta de sistema de archivos completamente cualificada.

    Importante

    Las partes de ruta proporcionadas en la llamada a System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* pueden contener caracteres no permitidos en el espacio de nombres del proveedor. Lo más probable es que estos caracteres se utilicen para la expansión de comodines y la implementación de este método no debería eliminarlos.

Recuperación de la Ruta Principal

Los proveedores de navegación de Windows PowerShell implementan el método System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* para recuperar la parte principal de la ruta específica del proveedor total o parcial indicada. El método elimina la parte hija del camino y devuelve la parte del camino padre. El root parámetro especifica el camino completamente cualificado hacia la raíz de una unidad. Este parámetro puede ser nulo o vacío si no se utiliza un disco montado para la operación de recuperación. Si se especifica una raíz, el método debe devolver un camino a un contenedor en el mismo árbol que la raíz.

El proveedor de navegación de ejemplo no anula este método, sino que utiliza la implementación predeterminada. Acepta caminos que usan tanto "/" como "\" como separadores de camino. Primero normaliza el camino para que solo tenga separadores "\", luego separa el camino padre en el último "\" y devuelve el camino padre.

Para recordar la implementación de GetParentPath

Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* debería separar el camino léxicamente en el separador de rutas para el espacio de nombres del proveedor. Por ejemplo, el proveedor del Sistema de Archivos utiliza este método para buscar el último "\" y devuelve todo a la izquierda del separador.

Recuperar el nombre de la ruta hija

Tu proveedor de navegación implementa el método System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* para recuperar el nombre (elemento hoja) del hijo del elemento ubicado en la ruta específica del proveedor total o parcial indicada.

El proveedor de navegación de ejemplo no anula este método. La implementación predeterminada se muestra a continuación. Acepta caminos que usan tanto "/" como "\" como separadores de camino. Primero normaliza el camino para que solo tenga separadores "\", luego separa el camino padre en el último "\" y devuelve el nombre de la parte del camino hijo.

Cosas a recordar sobre la implementación de GetChildName

Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* debería separar el camino léxicamente en el separador de caminos. Si el camino suministrado no contiene separadores de camino, el método debería devolver el camino sin modificar.

Importante

La ruta proporcionada en la llamada a este método podría contener caracteres que son ilegales en el espacio de nombres del proveedor. Lo más probable es que estos caracteres se utilicen para la expansión de comodines o para emparejamiento de expresiones regulares, y la implementación de este método no debería eliminarlos.

Determinar si un objeto es un contenedor

El proveedor de navegación puede implementar el método System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* para determinar si la ruta especificada indica un contenedor. Devuelve true si el camino representa un contenedor, y false en caso contrario. El usuario necesita este método para poder usar el Test-Path cmdlet para la ruta suministrada.

El siguiente código muestra la implementación System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* en nuestro proveedor de navegación de ejemplo. El método verifica que el camino especificado es correcto y si la tabla existe, y devuelve true si el camino indica un contenedor.

protected override bool IsItemContainer(string path)
{
   if (PathIsDrive(path)) 
   { 
       return true; 
   }
   
   string[] pathChunks = ChunkPath(path);
   string tableName;
   int rowNumber;

   PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
   
   if (type == PathType.Table)
   {
      foreach (DatabaseTableInfo ti in GetTables())
      {
          if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
          {
              return true;
          }
      } // foreach (DatabaseTableInfo...
   } // if (pathChunks...

   return false;
} // IsItemContainer

Cosas a recordar sobre la implementación de IsItemContainer

Tu clase .NET de proveedor de navegación podría declarar capacidades de proveedor de ExpandWildcards, Filtrar, Incluir o Excluir, de la enumeración System.Management.Automation.Provider.ProviderCapabilities . En este caso, la implementación de System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* debe garantizar que la ruta pasada cumpla con los requisitos. Para ello, el método debe acceder a la propiedad correspondiente, por ejemplo, la propiedad System.Management.Automation.Provider.CmdletProvider.Exclude* .

Moviendo un objeto

Para apoyar el Move-Item cmdlet, tu proveedor de navegación implementa el método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Este método mueve el elemento especificado por el path parámetro al contenedor en la ruta proporcionada en el destination parámetro.

El proveedor de navegación de ejemplo no anula el método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . La siguiente es la implementación predeterminada.

Cosas a recordar sobre la implementación de MoveItem

Tu clase .NET de proveedor de navegación podría declarar capacidades de proveedor de ExpandWildcards, Filtrar, Incluir o Excluir, de la enumeración System.Management.Automation.Provider.ProviderCapabilities . En este caso, la implementación de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe garantizar que la ruta pasada cumpla con los requisitos. Para ello, el método debe acceder a la propiedad correspondiente, por ejemplo, el CmdletProvider.Excluir la propiedad.

Por defecto, las sobrescrituras de este método no deberían mover objetos sobre objetos existentes a menos que la propiedad System.Management.Automation.Provider.CmdletProvider.Force* esté establecida en true. Por ejemplo, el proveedor del Sistema de Archivos no copiará C:\temp\abc.txt sobre un archivo de C:\bar.txt existente a menos que la propiedad System.Management.Automation.Provider.CmdletProvider.Force* esté configurada en true. Si la ruta especificada en el destination parámetro existe y es un contenedor, la propiedad System.Management.Automation.Provider.CmdletProvider.Force* no es necesaria. En este caso, System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe mover el elemento indicado por el path parámetro al contenedor indicado por el destination parámetro como hijo.

Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe llamar a System.Management.Automation.Provider.CmdletProvider.ShouldProcess y comprobar su valor de retorno antes de realizar cualquier cambio en el almacén de datos. Este método se utiliza para confirmar la ejecución de una operación cuando se realiza un cambio en el estado del sistema, por ejemplo, la eliminación de archivos. System.Management.Automation.Provider.CmdletProvider.ShouldProcess envía el nombre del recurso a cambiar al usuario, teniendo en cuenta el entorno de ejecución de Windows PowerShell cualquier configuración de línea de comandos o variable de preferencia para determinar qué debe mostrarse al usuario.

Tras la llamada a System.Management.Automation.Provider.CmdletProvider.ShouldProcess , trueel método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe llamar al método System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Este método envía un mensaje al usuario para permitir retroalimentación que indique si la operación debe continuar. Tu proveedor debe llamar a System.Management.Automation.Provider.CmdletProvider.ShouldContinue como comprobación adicional para posibles modificaciones peligrosas del sistema.

Adjuntar parámetros dinámicos al Move-Item cmdlet

A veces el Move-Item cmdlet requiere parámetros adicionales que se proporcionan dinámicamente en tiempo de ejecución. Para proporcionar estos parámetros dinámicos, el proveedor de navegación debe implementar el método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* para obtener los valores de parámetros requeridos del elemento en la ruta indicada, y devolver un objeto que tenga propiedades y campos con atributos de análisis similar a una clase cmdlet o un objeto System.Management.Automation.RuntimeDefinedParameterDictionary .

Este proveedor de navegación no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normalización de un camino relativo

Tu proveedor de navegación implementa el método System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* para normalizar la ruta totalmente cualificada indicada en el path parámetro como relativa a la ruta especificada por el basePath parámetro. El método devuelve una representación de cadena del camino normalizado. Escribe un error si el path parámetro especifica un camino inexistente.

El proveedor de navegación de ejemplo no anula este método. La siguiente es la implementación predeterminada.

Cosas a recordar sobre la implementación de NormalizeRelativePath

Tu implementación de System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* debería analizar el path parámetro, pero no tiene que usar un análisis sintáctico puro. Se recomienda diseñar este método para usar el camino y buscar la información del camino en el almacén de datos y crear un camino que coincida con la sintaxis del caricia y el camino estandarizado.

Ejemplo de código

Para un código de ejemplo completo, véase AccessDbProviderSample05 Code Sample.

Definición de tipos de objetos y formato

Es posible que un proveedor añada miembros a objetos existentes o defina nuevos objetos. Para más información,véase Extensión de tipos de objetos y formato.

Construcción del proveedor PowerShell de Windows

Para más información, consulte Cómo registrar comandantes, proveedores y aplicaciones anfitrionas.

Probando el proveedor PowerShell de Windows

Cuando tu proveedor de Windows PowerShell esté registrado en Windows PowerShell, puedes probarlo ejecutando los cmdlets compatibles en la línea de comandos, incluyendo los cmdlets disponibles por derivación. Este ejemplo pondrá a prueba el proveedor de navegación de muestras.

  1. Ejecuta tu nuevo shell y usa el Set-Location cmdlet para establecer la ruta que indique la base de datos de Access.

    Set-Location mydb:
    
  2. Ahora ejecuta el Get-ChildItem cmdlet para recuperar una lista de los elementos de la base de datos, que son las tablas disponibles de la base de datos. Para cada tabla, este cmdlet también recupera el número de filas de la tabla.

    Get-ChildItem | Format-Table RowCount, Name -AutoSize
    
    RowCount   Name
    --------   ----
         180   MSysAccessObjects
           0   MSysACEs
           1   MSysCmdbars
           0   MSysIMEXColumns
           0   MSysIMEXSpecs
           0   MSysObjects
           0   MSysQueries
           7   MSysRelationships
           8   Categories
          91   Customers
           9   Employees
        2155   Order Details
         830   Orders
          77   Products
           3   Shippers
          29   Suppliers
    
  3. Usa el Set-Location cmdlet de nuevo para establecer la ubicación de la tabla de datos de empleados.

    Set-Location Employees
    
  4. Ahora usemos el Get-Location cmdlet para recuperar el camino hacia la tabla de empleados.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Ahora usa el Get-ChildItem cmdlet conectado al Format-Table cmdlet. Este conjunto de cmdlets recupera los elementos para la tabla de datos de Empleados, que son las filas de la tabla. Están formateados según lo especificado por el Format-Table cmdlet.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   PSIsContainer   Data
    ---------   --------------   ----
    0           False            System.Data.DataRow
    1           False            System.Data.DataRow
    2           False            System.Data.DataRow
    3           False            System.Data.DataRow
    4           False            System.Data.DataRow
    5           False            System.Data.DataRow
    6           False            System.Data.DataRow
    7           False            System.Data.DataRow
    8           False            System.Data.DataRow
    
  6. Ahora puedes ejecutar el Get-Item cmdlet para recuperar los elementos de la fila 0 de la tabla de datos de Empleados.

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\Employees\0
    PSParentPath  : AccessDB::C:\PS\Northwind.mdb\Employees
    PSChildName   : 0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data           : System.Data.DataRow
    RowNumber      : 0
    
  7. Usa de nuevo el Get-Item cmdlet para recuperar los datos del empleado de los elementos de la fila 0.

    (Get-Item 0).Data
    
    EmployeeID      : 1
    LastName        : Davis
    FirstName       : Sara
    Title           : Sales Representative
    TitleOfCourtesy : Ms.
    BirthDate       : 12/8/1968 12:00:00 AM
    HireDate        : 5/1/1992 12:00:00 AM
    Address         : 4567 Main Street
                      Apt. 2A
    City            : Buffalo
    Region          : NY
    PostalCode      : 98052
    Country         : USA
    HomePhone       : (206) 555-9857
    Extension       : 5467
    Photo           : EmpID1.bmp
    Notes           : Education includes a BA in psychology from
                      Colorado State University. She also completed "The
                      Art of the Cold Call."  Nancy is a member of
                      Toastmasters International.
    ReportsTo       : 2
    

Véase también

Creación de proveedores PowerShell para Windows

Diseña tu proveedor PowerShell para Windows

Ampliación de los tipos de objetos y formato

Implementar un proveedor de PowerShell para contenedores de Windows

Cómo registrar comandantes, proveedores y aplicaciones anfitrionas

Guía del programador de PowerShell para Windows

Windows PowerShell SDK