Compartir a través de


Creación de un proveedor de elementos en PowerShell para Windows

Este tema describe cómo crear un proveedor de PowerShell para Windows que pueda manipular los datos en un almacén de datos. En este tema, los elementos de datos en el almacén se denominan los "elementos" del almacén de datos. Como consecuencia, un proveedor que puede manipular los datos en la tienda se denomina proveedor de elementos de Windows PowerShell.

Nota:

Puedes descargar el archivo fuente en C# (AccessDBSampleProvider03.cs) 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 PowerShell Samples directorio. Para más información sobre otras implementaciones de proveedores de Windows PowerShell, consulte Diseñando su proveedor de PowerShell para Windows.

El proveedor de elementos de Windows PowerShell descrito en este tema obtiene datos de una base de datos de Access. En este caso, un "elemento" es o bien una tabla en la base de datos Access o una fila en una tabla.

Definición de la clase proveedor de ítems PowerShell de Windows

Un proveedor de ítems de PowerShell para Windows debe definir una clase .NET que derive de la clase base System.Management.Automation.Provider.ItemCmdletProvider . A continuación se muestra la definición de clase para el proveedor de elementos descrita en esta sección.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

public class AccessDBProvider : ItemCmdletProvider

Obsábanse que en esta definición de clase, 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 hay capacidades específicas de Windows para PowerShell añadidas.

Definición de la funcionalidad base

Como se describe en Design Your Windows PowerShell Provider, la clase System.Management.Automation.Provider.DriveCmdletProvider deriva de varias otras clases que ofrecían diferentes funcionalidades de proveedores. Por tanto, un proveedor de elementos de Windows PowerShell debe definir toda la funcionalidad proporcionada por esas clases.

Para más información sobre cómo implementar funcionalidades para añadir información de inicialización específica de la sesión y para liberar recursos utilizados por el proveedor, véase Creación de un proveedor básico de PowerShell para Windows. Sin embargo, la mayoría de los proveedores, incluido el que se describe aquí, pueden usar la implementación predeterminada de esta funcionalidad que ofrece Windows PowerShell.

Antes de que el proveedor de ítems PowerShell de Windows pueda manipular los elementos en la almacén, debe implementar los métodos de la clase base System.Management.Automation.Provider.DriveCmdletProvider para acceder al almacén de datos. Para más información sobre cómo implementar esta clase, consulte Creación de un proveedor de unidades PowerShell para Windows.

Comprobación de la validez del camino

Al buscar un dato, el entorno de ejecución de Windows PowerShell proporciona una ruta de Windows PowerShell al proveedor, tal como se define en la sección "Conceptos de PSPath" de Cómo funciona Windows PowerShell. Un proveedor de elementos de Windows PowerShell debe verificar la validez sintáctica y semántica de cualquier ruta que le sea transmitida implementando el método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Este método devuelve true si el camino es válido, y false en caso contrario. Ten en cuenta que la implementación de este método no debe verificar la existencia del elemento en el camino, sino solo que el camino es sintácticamente y semánticamente correcto.

Aquí está la implementación del método System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath para este proveedor. Ten en cuenta que esta implementación llama a un método auxiliar NormalizePath para convertir todos los separadores del camino a uno uniforme.

protected override bool IsValidPath(string path)
{
    bool result = true;

    // check if the path is null or empty
    if (String.IsNullOrEmpty(path))
    {
        result = false;
    }

    // convert all separators in the path to a uniform one
    path = NormalizePath(path);

    // split the path into individual chunks
    string[] pathChunks = path.Split(pathSeparator.ToCharArray());

    foreach (string pathChunk in pathChunks)
    {
        if (pathChunk.Length == 0)
        {
            result = false;
        }
    }
    return result;
} // IsValidPath

Determinar si existe un objeto

Tras verificar la ruta, el entorno de ejecución de Windows PowerShell debe determinar si existe un dato en esa ruta. Para soportar este tipo de consulta, el proveedor de ítems PowerShell de Windows implementa el método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Este método devuelve true un elemento que se encuentra en la ruta especificada y false (por defecto) en caso contrario.

Aquí está la implementación del método System.Management.Automation.Provider.ItemCmdletProvider.ItemExists para este proveedor. Ten en cuenta que este método llama a los métodos auxiliares PathIsDrive, ChunkPath y GetTable , y utiliza un objeto DatabaseTableInfo definido por el proveedor.

protected override bool ItemExists(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        return true;
    }

    // Obtain type, table name and row number from path
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    DatabaseTableInfo table = GetTable(tableName);

    if (type == PathType.Table)
    {
        // if specified path represents a table then DatabaseTableInfo
        // object for the same should exist
        if (table != null)
        {
            return true;
        }
    }
    else if (type == PathType.Row)
    {
        // if specified path represents a row then DatabaseTableInfo should
        // exist for the table and then specified row number must be within
        // the maximum row count in the table
        if (table != null && rowNumber < table.RowCount)
        {
            return true;
        }
    }

    return false;

} // ItemExists

Cosas a recordar sobre la implementación de ItemExists

Las siguientes condiciones pueden aplicarse a tu implementación de System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Adjuntar parámetros dinámicos al cmdlet de Test-Path

A veces, el Test-Path cmdlet que llama a System.Management.Automation.Provider.ItemCmdletProvider.ItemExists requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución. Para proporcionar estos parámetros dinámicos, el proveedor de ítems de Windows PowerShell debe implementar el método System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Este método recupera los parámetros dinámicos del elemento en la ruta indicada y devuelve un objeto que tiene propiedades y campos con atributos de análisis similar a una clase cmdlet o un objeto System.Management.Automation.RuntimeDefinedParameterDictionary . El entorno de ejecución de Windows PowerShell utiliza el objeto devuelto para añadir los parámetros al Test-Path cmdlet.

Este proveedor de elementos de Windows PowerShell no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de este método.

Recuperar un objeto

Para recuperar un elemento, el proveedor de ítems de Windows PowerShell debe sobrescribir el método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para soportar llamadas desde el Get-Item cmdlet. Este método escribe el elemento utilizando el método System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Aquí está la implementación del método System.Management.Automation.Provider.ItemCmdletProvider.GetItem para este proveedor. Ten en cuenta que este método utiliza los métodos helper GetTable y GetRow para recuperar elementos que son tablas en la base de datos Access o filas en una tabla de datos.

protected override void GetItem(string path)
{
    // check if the path represented is a drive
    if (PathIsDrive(path))
    {
        WriteItemObject(this.PSDriveInfo, path, true);
        return;
    }// if (PathIsDrive...

     // Get table name and row information from the path and do 
     // necessary actions
     string tableName;
     int rowNumber;

     PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

     if (type == PathType.Table)
     {
         DatabaseTableInfo table = GetTable(tableName);
         WriteItemObject(table, path, true);
     }
     else if (type == PathType.Row)
     {
         DatabaseRowInfo row = GetRow(tableName, rowNumber);
         WriteItemObject(row, path, false);
     }
     else
     {
         ThrowTerminatingInvalidPathException(path);
     }

 } // GetItem

Cosas a recordar sobre la implementación de GetItem

Las siguientes condiciones pueden aplicarse a una implementación de System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Adjuntar parámetros dinámicos al cmdlet de Get-Item

A veces el Get-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución. Para proporcionar estos parámetros dinámicos, el proveedor de ítems de Windows PowerShell debe implementar el método System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Este método recupera los parámetros dinámicos del elemento en la ruta indicada y devuelve un objeto que tiene propiedades y campos con atributos de análisis similar a una clase cmdlet o un objeto System.Management.Automation.RuntimeDefinedParameterDictionary . El entorno de ejecución de Windows PowerShell utiliza el objeto devuelto para añadir los parámetros al Get-Item cmdlet.

Este proveedor no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de este método.

Colocación de un objeto

Para establecer un elemento, el proveedor de ítems de Windows PowerShell debe sobrescribir el método System.Management.Automation.Provider.ItemCmdletProvider.SetItem para soportar llamadas desde el Set-Item cmdlet. Este método establece el valor del elemento en la ruta especificada.

Este proveedor no proporciona una anulación para el método System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Sin embargo, la siguiente es la implementación predeterminada de este método.

Cosas a recordar sobre la implementación de SetItem

Las siguientes condiciones pueden aplicarse a tu implementación de System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Recuperación de parámetros dinámicos para SetItem

A veces el Set-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución. Para proporcionar estos parámetros dinámicos, el proveedor de ítems de Windows PowerShell debe implementar el método System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Este método recupera los parámetros dinámicos del elemento en la ruta indicada y devuelve un objeto que tiene propiedades y campos con atributos de análisis similar a una clase cmdlet o un objeto System.Management.Automation.RuntimeDefinedParameterDictionary . El entorno de ejecución de Windows PowerShell utiliza el objeto devuelto para añadir los parámetros al Set-Item cmdlet.

Este proveedor no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de este método.

Limpiar un artículo

Para borrar un elemento, el proveedor de ítems de Windows PowerShell implementa el método System.Management.Automation.Provider.ItemCmdletProvider.ClearItem para soportar llamadas desde el Clear-Item cmdlet. Este método borra el elemento de datos en la ruta especificada.

Este proveedor no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de este método.

Cosas a recordar sobre la implementación de ClearItem

Las siguientes condiciones pueden aplicarse a una implementación de System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Recuperar parámetros dinámicos para ClearItem

A veces el Clear-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución. Para proporcionar estos parámetros dinámicos, el proveedor de ítems de Windows PowerShell debe implementar el método System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Este método recupera los parámetros dinámicos del elemento en la ruta indicada y devuelve un objeto que tiene propiedades y campos con atributos de análisis similar a una clase cmdlet o un objeto System.Management.Automation.RuntimeDefinedParameterDictionary . El entorno de ejecución de Windows PowerShell utiliza el objeto devuelto para añadir los parámetros al Clear-Item cmdlet.

Este proveedor de artículos no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de este método.

Realizar una acción predeterminada para un objeto

Un proveedor de elementos PowerShell de Windows puede implementar el método System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction para soportar llamadas desde el Invoke-Item cmdlet, lo que permite al proveedor realizar una acción predeterminada para el elemento en la ruta especificada. Por ejemplo, el proveedor del Sistema de Archivos podría usar este método para llamar a ShellExecute para un elemento específico.

Este proveedor no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de este método.

Cosas a recordar sobre la implementación de InvokeDefaultAction

Las siguientes condiciones pueden aplicarse a una implementación de System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Recuperar parámetros dinámicos para InvokeDefaultAction

A veces el Invoke-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución. Para proporcionar estos parámetros dinámicos, el proveedor de elementos de Windows PowerShell debe implementar el método System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Este método recupera los parámetros dinámicos del elemento en la ruta indicada y devuelve un objeto que tiene propiedades y campos con atributos de análisis similar a una clase cmdlet o un objeto System.Management.Automation.RuntimeDefinedParameterDictionary . El entorno de ejecución de Windows PowerShell utiliza el objeto devuelto para añadir los parámetros dinámicos al Invoke-Item cmdlet.

Este proveedor de artículos no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de este método.

Implementación de métodos y clases auxiliares

Este proveedor de ítems implementa varios métodos y clases auxiliares que son utilizados por los métodos públicos de anulación definidos por Windows PowerShell. El código de estos métodos y clases auxiliares se muestra en la sección de Ejemplo de Código .

Método NormalizePath

Este proveedor de ítems implementa un método ayudante NormalizePath para asegurar que el camino tenga un formato consistente. El formato especificado utiliza una barra diagonal (\) como separador.

Método PathIsDrive

Este proveedor de elementos implementa un método asistente PathIsDrive para determinar si la ruta especificada es realmente el nombre de la unidad.

Método ChunkPath

Este proveedor de ítems implementa un método ChunkPath helper que desmenuza la ruta especificada para que el proveedor pueda identificar sus elementos individuales. Devuelve un array compuesto por los elementos del camino.

Método GetTable

Este proveedor de elementos implementa el método GetTables helper que devuelve un objeto DatabaseTableInfo que representa información sobre la tabla especificada en la llamada.

Método GetRow

El método System.Management.Automation.Provider.ItemCmdletProvider.GetItem de este proveedor de ítems llama al método helper GetRows . Este método auxiliar recupera un objeto DatabaseRowInfo que representa información sobre la fila especificada en la tabla.

Clase DatabaseTableInfo

Este proveedor de ítems define una clase DatabaseTableInfo que representa una colección de información en una tabla de datos de la base de datos. Esta clase es similar a la clase System.IO.Directoryinfo .

El proveedor de elementos de ejemplo define un método DatabaseTableInfo.GetTables que devuelve una colección de objetos de información de tabla que definen las tablas de la base de datos. Este método incluye un bloque try/catch para asegurar que cualquier error de base de datos aparezca como una fila con cero entradas.

Clase DatabaseRowInfo

Este proveedor de ítems define la clase auxiliar DatabaseRowInfo que representa una fila en una tabla de la base de datos. Esta clase es similar a la clase System.IO.FileInfo .

El proveedor de ejemplo define un método DatabaseRowInfo.GetRows para devolver una colección de objetos de información de fila para la tabla especificada. Este método incluye un bloqueo try/catch para atrapar excepciones. Cualquier error resultará en que no haya información de fila.

Ejemplo de código

Para ver el código de muestra completo, consulte AccessDbProviderSample03 Code Sample.

Definición de tipos de objetos y formato

Al escribir un proveedor, puede ser necesario añadir miembros a objetos existentes o definir nuevos objetos. Cuando termines, crea un archivo Types que Windows PowerShell pueda usar para identificar los miembros del objeto y un archivo Format que defina cómo se muestra el objeto. Para más información, véase Extensión de tipos de objetos y formato.

Construcción del proveedor PowerShell de Windows

Consulta cómo registrar cmdlets, proveedores y aplicaciones anfitrionas.

Probando el proveedor PowerShell de Windows

Cuando este proveedor de elementos de Windows PowerShell está registrado en Windows PowerShell, solo puedes probar la funcionalidad básica y de unidad del proveedor. Para probar la manipulación de elementos, también debes implementar la funcionalidad de contenedores descrita en Implementing a Container Windows PowerShell Provider.

Consulte también