Creación de un proveedor de contenedores de Windows PowerShellCreating a Windows PowerShell Container Provider

En este tema se describe cómo crear un proveedor de Windows PowerShell que pueda trabajar en almacenes de datos de varias capas.This topic describes how to create a Windows PowerShell provider that can work on multi-layer data stores. Para este tipo de almacén de datos, el nivel superior del almacén contiene los elementos raíz y cada nivel subsiguiente se denomina nodo de los elementos secundarios.For this type of data store, the top level of the store contains the root items and each subsequent level is referred to as a node of child items. Al permitir que el usuario trabaje en estos nodos secundarios, un usuario puede interactuar jerárquicamente a través del almacén de datos.By allowing the user to work on these child nodes, a user can interact hierarchically through the data store.

Los proveedores que pueden trabajar en almacenes de datos de varios niveles se conocen como proveedores de contenedores de Windows PowerShell.Providers that can work on multi-level data stores are referred to as Windows PowerShell container providers. Sin embargo, tenga en cuenta que solo se puede usar un proveedor de contenedores de Windows PowerShell cuando hay un contenedor (sin contenedores anidados) con elementos contenidos en él.However, be aware that a Windows PowerShell container provider can be used only when there is one container (no nested containers) with items in it. Si hay contenedores anidados, debe implementar un proveedor de navegación de Windows PowerShell.If there are nested containers, then you must implement a Windows PowerShell navigation provider. Para obtener más información sobre cómo implementar el proveedor de navegación de Windows PowerShell, consulte crear un proveedor de navegación de Windows PowerShell.For more information about implementing Windows PowerShell navigation provider, see Creating a Windows PowerShell Navigation Provider.

Nota

Puede descargar el archivo de código fuente de C# (AccessDBSampleProvider04.cs) para este proveedor mediante el kit de desarrollo de software de Microsoft Windows para Windows Vista y los componentes de tiempo de ejecución de .NET Framework 3,0.You can download the C# source file (AccessDBSampleProvider04.cs) for this provider using the Microsoft Windows Software Development Kit for Windows Vista and .NET Framework 3.0 Runtime Components. Para obtener instrucciones de descarga, consulte Cómo instalar Windows PowerShell y descargar el SDK de Windows PowerShell.For download instructions, see How to Install Windows PowerShell and Download the Windows PowerShell SDK. Los archivos de origen descargados están disponibles en el <PowerShell Samples> directorio.The downloaded source files are available in the <PowerShell Samples> directory. Para obtener más información sobre otras implementaciones del proveedor de Windows PowerShell, vea diseñar el proveedor de Windows PowerShell.For more information about other Windows PowerShell provider implementations, see Designing Your Windows PowerShell Provider.

El proveedor de contenedores de Windows PowerShell que se describe aquí define la base de datos como su contenedor único, con las tablas y filas de la base de datos definidas como elementos del contenedor.The Windows PowerShell container provider described here defines the database as its single container, with the tables and rows of the database defined as items of the container.

Precaución

Tenga en cuenta que este diseño supone que hay una base de datos que tiene un campo con el identificador de nombre y que el tipo del campo es LongInteger.Be aware that this design assumes a database that has a field with the name ID, and that the type of the field is LongInteger.

Definir una clase de proveedor de contenedores de Windows PowerShellDefining a Windows PowerShell Container Provider Class

Un proveedor de contenedores de Windows PowerShell debe definir una clase .NET que derive de la clase base System. Management. Automation. Provider. Containercmdletprovider .A Windows PowerShell container provider must define a .NET class that derives from the System.Management.Automation.Provider.Containercmdletprovider base class. Esta es la definición de clase del proveedor de contenedores de Windows PowerShell que se describe en esta sección.Here is the class definition for the Windows PowerShell container provider described in this section.

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

Observe que en esta definición de clase, el atributo System. Management. Automation. Provider. Cmdletproviderattribute incluye dos parámetros.Notice that in this class definition, the System.Management.Automation.Provider.Cmdletproviderattribute attribute includes two parameters. El primer parámetro especifica un nombre descriptivo para el proveedor que usa Windows PowerShell.The first parameter specifies a user-friendly name for the provider that is used by Windows PowerShell. El segundo parámetro especifica las capacidades específicas de Windows PowerShell que el proveedor expone al tiempo de ejecución de Windows PowerShell durante el procesamiento de comandos.The second parameter specifies the Windows PowerShell specific capabilities that the provider exposes to the Windows PowerShell runtime during command processing. Para este proveedor, no hay ninguna funcionalidad específica de Windows PowerShell que se agregue.For this provider, there are no Windows PowerShell specific capabilities that are added.

Definir la funcionalidad básicaDefining Base Functionality

Como se describe en diseñar un proveedor de Windows PowerShell, la clase System. Management. Automation. Provider. Containercmdletprovider se deriva de otras clases que proporcionan una funcionalidad de proveedor diferente.As described in Designing Your Windows PowerShell Provider, the System.Management.Automation.Provider.Containercmdletprovider class derives from several other classes that provided different provider functionality. Por lo tanto, un proveedor de contenedores de Windows PowerShell debe definir toda la funcionalidad proporcionada por esas clases.A Windows PowerShell container provider, therefore, needs to define all of the functionality provided by those classes.

Para implementar la funcionalidad para agregar información de inicialización específica de la sesión y liberar recursos utilizados por el proveedor, consulte crear un proveedor de Windows PowerShell básico.To implement functionality for adding session-specific initialization information and for releasing resources that are used by the provider, see Creating a Basic Windows PowerShell Provider. Sin embargo, la mayoría de los proveedores (incluido el proveedor descrito aquí) pueden usar la implementación predeterminada de esta funcionalidad proporcionada por Windows PowerShell.However, most providers (including the provider described here) can use the default implementation of this functionality that is provided by Windows PowerShell.

Para obtener acceso al almacén de datos, el proveedor debe implementar los métodos de la clase base System. Management. Automation. Provider. Drivecmdletprovider .To get access to the data store, the provider must implement the methods of the System.Management.Automation.Provider.Drivecmdletprovider base class. Para obtener más información sobre la implementación de estos métodos, vea crear un proveedor de unidades de Windows PowerShell.For more information about implementing these methods, see Creating an Windows PowerShell Drive Provider.

Para manipular los elementos de un almacén de datos, como obtener, establecer y borrar elementos, el proveedor debe implementar los métodos proporcionados por la clase base System. Management. Automation. Provider. Itemcmdletprovider .To manipulate the items of a data store, such as getting, setting, and clearing items, the provider must implement the methods provided by the System.Management.Automation.Provider.Itemcmdletprovider base class. Para obtener más información sobre la implementación de estos métodos, vea crear un proveedor de elementos de Windows PowerShell.For more information about implementing these methods, see Creating an Windows PowerShell Item Provider.

Recuperar elementos secundariosRetrieving Child Items

Para recuperar un elemento secundario, el proveedor de contenedores de Windows PowerShell debe invalidar el método System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * para admitir llamadas del Get-ChildItem cmdlet.To retrieve a child item, the Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* method to support calls from the Get-ChildItem cmdlet. Este método recupera los elementos secundarios del almacén de datos y los escribe en la canalización como objetos.This method retrieves child items from the data store and writes them to the pipeline as objects. Si recurse se especifica el parámetro del cmdlet, el método recupera todos los elementos secundarios sin tener en consideración el nivel en el que se encuentran.If the recurse parameter of the cmdlet is specified, the method retrieves all children regardless of what level they are at. Si recurse no se especifica el parámetro, el método recupera un solo nivel de elementos secundarios.If the recurse parameter is not specified, the method retrieves only a single level of children.

Esta es la implementación del método System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * para este proveedor.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* method for this provider. Tenga en cuenta que este método recupera los elementos secundarios en todas las tablas de base de datos cuando la ruta de acceso indica la base de datos de Access y recupera los elementos secundarios de las filas de esa tabla si la ruta de acceso indica una tabla de datos.Notice that this method retrieves the child items in all database tables when the path indicates the Access database, and retrieves the child items from the rows of that table if the path indicates a data table.

protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

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

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems
protected override void GetChildItems(string path, bool recurse)
{
    // If path represented is a drive then the children in the path are 
    // tables. Hence all tables in the drive represented will have to be
    // returned
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table, path, true);

            // if the specified item exists and recurse has been set then 
            // all child items within it have to be obtained as well
            if (ItemExists(path) && recurse)
            {
                GetChildItems(path + pathSeparator + table.Name, recurse);
            }
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get the table name, row number and type of path from the
        // path specified
        string tableName;
        int rowNumber;

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

        if (type == PathType.Table)
        {
            // Obtain all the rows within the table
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);
            WriteItemObject(row, path + pathSeparator + row.RowNumber,
                        false);
        }
        else
        {
            // In this case, the path specified is not valid
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildItems

Aspectos que se deben recordar sobre la implementación de GetChildItemsThings to Remember About Implementing GetChildItems

Se pueden aplicar las siguientes condiciones a su implementación de System. Management. Automation. Provider. Containercmdletprovider. Getchilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Adjuntar parámetros dinámicos al cmdlet Get-ChildItemAttaching Dynamic Parameters to the Get-ChildItem Cmdlet

A veces, el Get-ChildItem cmdlet que llama a System. Management. Automation. Provider. Containercmdletprovider. Getchilditems * requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución.Sometimes the Get-ChildItem cmdlet that calls System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* requires additional parameters that are specified dynamically at runtime. Para proporcionar estos parámetros dinámicos, el proveedor de contenedores de Windows PowerShell debe implementar el método System. Management. Automation. Provider. Containercmdletprovider. Getchilditemsdynamicparameters * .To provide these dynamic parameters, the Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters* method. Este método recupera los parámetros dinámicos para el elemento en la ruta de acceso indicada y devuelve un objeto que tiene propiedades y campos con los atributos de análisis similares a una clase de cmdlet o un objeto System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves dynamic parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. El tiempo de ejecución de Windows PowerShell usa el objeto devuelto para agregar los parámetros al Get-ChildItem cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Get-ChildItem cmdlet.

Este proveedor de contenedores de Windows PowerShell no implementa este método.This Windows PowerShell container provider does not implement this method. Sin embargo, el código siguiente es la implementación predeterminada de este método.However, the following code is the default implementation of this method.

Recuperar nombres de elementos secundariosRetrieving Child Item Names

Para recuperar los nombres de los elementos secundarios, el proveedor de contenedores de Windows PowerShell debe invalidar el método System. Management. Automation. Provider. Containercmdletprovider. Getchildnames * para admitir llamadas del Get-ChildItem cmdlet cuando Name se especifica su parámetro.To retrieve the names of child items, the Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* method to support calls from the Get-ChildItem cmdlet when its Name parameter is specified. Este método recupera los nombres de los elementos secundarios de la ruta de acceso especificada o los nombres de los elementos secundarios de todos los contenedores si returnAllContainers se especifica el parámetro del cmdlet.This method retrieves the names of the child items for the specified path or child item names for all containers if the returnAllContainers parameter of the cmdlet is specified. Un nombre secundario es la parte hoja de una ruta de acceso.A child name is the leaf portion of a path. Por ejemplo, el nombre secundario de la ruta de acceso c:\windows\system32\abc.dll es "abc.dll".For example, the child name for the path c:\windows\system32\abc.dll is "abc.dll". El nombre secundario para el directorio c:\windows\system32 es "system32".The child name for the directory c:\windows\system32 is "system32".

Esta es la implementación del método System. Management. Automation. Provider. Containercmdletprovider. Getchildnames * para este proveedor.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* method for this provider. Tenga en cuenta que el método recupera los nombres de tabla si la ruta de acceso especificada indica la base de datos de Access (unidad) y los números de fila si la ruta de acceso indica una tabla.Notice that the method retrieves table names if the specified path indicates the Access database (drive) and row numbers if the path indicates a table.

protected override void GetChildNames(string path,
                            ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

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

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames
protected override void GetChildNames(string path,
                              ReturnContainers returnContainers)
{
    // If the path represented is a drive, then the child items are
    // tables. get the names of all the tables in the drive.
    if (PathIsDrive(path))
    {
        foreach (DatabaseTableInfo table in GetTables())
        {
            WriteItemObject(table.Name, path, true);
        } // foreach (DatabaseTableInfo...
    } // if (PathIsDrive...
    else
    {
        // Get type, table name and row number from path specified
        string tableName;
        int rowNumber;

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

        if (type == PathType.Table)
        {
            // Get all the rows in the table and then write out the 
            // row numbers.
            foreach (DatabaseRowInfo row in GetRows(tableName))
            {
                WriteItemObject(row.RowNumber, path, false);
            } // foreach (DatabaseRowInfo...
        }
        else if (type == PathType.Row)
        {
            // In this case the user has directly specified a row, hence
            // just give that particular row
            DatabaseRowInfo row = GetRow(tableName, rowNumber);

            WriteItemObject(row.RowNumber, path, false);
        }
        else
        {
            ThrowTerminatingInvalidPathException(path);
        }
    } // else
} // GetChildNames

Aspectos que se deben recordar sobre la implementación de GetChildNamesThings to Remember About Implementing GetChildNames

Se pueden aplicar las siguientes condiciones a su implementación de System. Management. Automation. Provider. Containercmdletprovider. Getchilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Adjuntando parámetros dinámicos al cmdlet Get-ChildItem (Name)Attaching Dynamic Parameters to the Get-ChildItem Cmdlet (Name)

A veces, el Get-ChildItem cmdlet (con el Name parámetro) requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución.Sometimes the Get-ChildItem cmdlet (with the Name parameter) requires additional parameters that are specified dynamically at runtime. Para proporcionar estos parámetros dinámicos, el proveedor de contenedores de Windows PowerShell debe implementar el método System. Management. Automation. Provider. Containercmdletprovider. Getchildnamesdynamicparameters * .To provide these dynamic parameters, the Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters* method. Este método recupera los parámetros dinámicos para el elemento en la ruta de acceso indicada y devuelve un objeto que tiene propiedades y campos con atributos de análisis similares a una clase de cmdlet o un objeto System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the dynamic parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. El tiempo de ejecución de Windows PowerShell usa el objeto devuelto para agregar los parámetros al Get-ChildItem cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Get-ChildItem cmdlet.

Este proveedor no implementa este método.This provider does not implement this method. Sin embargo, el código siguiente es la implementación predeterminada de este método.However, the following code is the default implementation of this method.

Cambiar el nombre de los elementosRenaming Items

Para cambiar el nombre de un elemento, un proveedor de contenedores de Windows PowerShell debe invalidar el método System. Management. Automation. Provider. Containercmdletprovider. Renameitem * para admitir llamadas del Rename-Item cmdlet.To rename an item, a Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Renameitem* method to support calls from the Rename-Item cmdlet. Este método cambia el nombre del elemento en la ruta de acceso especificada al nuevo nombre proporcionado.This method changes the name of the item at the specified path to the new name provided. El nuevo nombre siempre debe ser relativo al elemento primario (contenedor).The new name must always be relative to the parent item (container).

Este proveedor no invalida el método System. Management. Automation. Provider. Containercmdletprovider. Renameitem * .This provider does not override the System.Management.Automation.Provider.Containercmdletprovider.Renameitem* method. Sin embargo, la implementación predeterminada es la siguiente.However, the following is the default implementation.

Aspectos que se deben recordar sobre la implementación de RenameItemThings to Remember About Implementing RenameItem

Se pueden aplicar las siguientes condiciones a su implementación de System. Management. Automation. Provider. Containercmdletprovider. Renameitem *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Renameitem*:

Asociar los parámetros dinámicos al cmdlet Rename-ItemAttaching Dynamic Parameters to the Rename-Item Cmdlet

A veces, el Rename-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución.Sometimes the Rename-Item cmdlet requires additional parameters that are specified dynamically at runtime. Para proporcionar estos parámetros dinámicos, el proveedor de contenedores de Windows PowerShell debe implementar el método System. Management. Automation. Provider. Containercmdletprovider. Renameitemdynamicparameters * .To provide these dynamic parameters, Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters* method. Este método recupera los parámetros para el elemento en la ruta de acceso indicada y devuelve un objeto que tiene propiedades y campos con los atributos de análisis similares a una clase de cmdlet o un objeto System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. El tiempo de ejecución de Windows PowerShell usa el objeto devuelto para agregar los parámetros al Rename-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Rename-Item cmdlet.

Este proveedor de contenedores no implementa este método.This container provider does not implement this method. Sin embargo, el código siguiente es la implementación predeterminada de este método.However, the following code is the default implementation of this method.

Crear nuevos elementosCreating New Items

Para crear nuevos elementos, un proveedor de contenedores debe implementar el método System. Management. Automation. Provider. Containercmdletprovider. newitem * para admitir llamadas del New-Item cmdlet.To create new items, a container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Newitem* method to support calls from the New-Item cmdlet. Este método crea un elemento de datos ubicado en la ruta de acceso especificada.This method creates a data item located at the specified path. El type parámetro del cmdlet contiene el tipo definido por el proveedor para el nuevo elemento.The type parameter of the cmdlet contains the provider-defined type for the new item. Por ejemplo, el proveedor FileSystem usa un type parámetro con un valor "File" o "Directory".For example, the FileSystem provider uses a type parameter with a value of "file" or "directory". El newItemValue parámetro del cmdlet especifica un valor específico del proveedor para el nuevo elemento.The newItemValue parameter of the cmdlet specifies a provider-specific value for the new item.

Esta es la implementación del método System. Management. Automation. Provider. Containercmdletprovider. newitem * para este proveedor.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Newitem* method for this provider.

protected override void NewItem( string path, string type, object newItemValue )
{
    // Create the new item here after
    // performing necessary validations
    //
    // WriteItemObject(newItemValue, path, false);

    // Example
    //
    // if (ShouldProcess(path, "new item"))
    // {
    //      // Create a new item and then call WriteObject
    //      WriteObject(newItemValue, path, false);
    // }

} // NewItem
{
    case 1:
        {
            string name = pathChunks[0];

            if (TableNameIsValid(name))
            {
                tableName = name;
                retVal = PathType.Table;
            }
        }
        break;

    case 2:
        {
            string name = pathChunks[0];

Aspectos que se deben recordar sobre la implementación de NewItemThings to Remember About Implementing NewItem

Las condiciones siguientes pueden aplicarse a su implementación de System. Management. Automation. Provider. Containercmdletprovider. newitem *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Adjuntar parámetros dinámicos al cmdlet New-ItemAttaching Dynamic Parameters to the New-Item Cmdlet

A veces, el New-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución.Sometimes the New-Item cmdlet requires additional parameters that are specified dynamically at runtime. Para proporcionar estos parámetros dinámicos, el proveedor de contenedores debe implementar el método System. Management. Automation. Provider. Containercmdletprovider. Newitemdynamicparameters * .To provide these dynamic parameters, the container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* method. Este método recupera los parámetros para el elemento en la ruta de acceso indicada y devuelve un objeto que tiene propiedades y campos con los atributos de análisis similares a una clase de cmdlet o un objeto System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. El tiempo de ejecución de Windows PowerShell usa el objeto devuelto para agregar los parámetros al New-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the New-Item cmdlet.

Este proveedor no implementa este método.This provider does not implement this method. Sin embargo, el código siguiente es la implementación predeterminada de este método.However, the following code is the default implementation of this method.

Quitar elementosRemoving Items

Para quitar elementos, el proveedor de Windows PowerShell debe invalidar el método System. Management. Automation. Provider. Containercmdletprovider. RemoveItem * para admitir llamadas del Remove-Item cmdlet.To remove items, the Windows PowerShell provider must override the System.Management.Automation.Provider.Containercmdletprovider.Removeitem* method to support calls from the Remove-Item cmdlet. Este método elimina un elemento del almacén de datos en la ruta de acceso especificada.This method deletes an item from the data store at the specified path. Si el recurse parámetro del Remove-Item cmdlet se establece en true , el método quita todos los elementos secundarios independientemente de su nivel.If the recurse parameter of the Remove-Item cmdlet is set to true, the method removes all child items regardless of their level. Si el parámetro se establece en false , el método quita un solo elemento en la ruta de acceso especificada.If the parameter is set to false, the method removes only a single item at the specified path.

Este proveedor no admite la eliminación de elementos.This provider does not support item removal. Sin embargo, el código siguiente es la implementación predeterminada de System. Management. Automation. Provider. Containercmdletprovider. RemoveItem *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.

Aspectos que se deben recordar sobre la implementación de RemoveItemThings to Remember About Implementing RemoveItem

Las condiciones siguientes pueden aplicarse a su implementación de System. Management. Automation. Provider. Containercmdletprovider. newitem *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Adjuntar parámetros dinámicos al cmdlet Remove-itemAttaching Dynamic Parameters to the Remove-Item Cmdlet

A veces, el Remove-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución.Sometimes the Remove-Item cmdlet requires additional parameters that are specified dynamically at runtime. Para proporcionar estos parámetros dinámicos, el proveedor de contenedores debe implementar el método System. Management. Automation. Provider. Containercmdletprovider. Removeitemdynamicparameters * para controlar estos parámetros.To provide these dynamic parameters, the container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* method to handle these parameters. Este método recupera los parámetros dinámicos para el elemento en la ruta de acceso indicada y devuelve un objeto que tiene propiedades y campos con atributos de análisis similares a una clase de cmdlet o un objeto System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the dynamic parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. El tiempo de ejecución de Windows PowerShell usa el objeto devuelto para agregar los parámetros al Remove-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Remove-Item cmdlet.

Este proveedor de contenedores no implementa este método.This container provider does not implement this method. Sin embargo, el código siguiente es la implementación predeterminada de System. Management. Automation. Provider. Containercmdletprovider. Removeitemdynamicparameters *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.

Consulta de elementos secundariosQuerying for Child Items

Para comprobar si existen elementos secundarios en la ruta de acceso especificada, el proveedor de contenedores de Windows PowerShell debe invalidar el método System. Management. Automation. Provider. Containercmdletprovider. Haschilditems * .To check to see if child items exist at the specified path, the Windows PowerShell container provider must override the System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* method. Este método devuelve true si el elemento tiene elementos secundarios y, de false lo contrario,.This method returns true if the item has children, and false otherwise. En el caso de una ruta de acceso nula o vacía, el método considera que los elementos del almacén de datos son secundarios y devuelven true .For a null or empty path, the method considers any items in the data store to be children and returns true.

Esta es la invalidación del método System. Management. Automation. Provider. Containercmdletprovider. Haschilditems * .Here is the override for the System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* method. Si hay más de dos partes de la ruta de acceso creadas por el método auxiliar ChunkPath, el método devuelve false , ya que solo se definen un contenedor de base de datos y un contenedor de tabla.If there are more than two path parts created by the ChunkPath helper method, the method returns false, since only a database container and a table container are defined. Para obtener más información sobre este método auxiliar, vea el método ChunkPath que se describe en crear un proveedor de elementos de Windows PowerShell.For more information about this helper method, see the ChunkPath method is discussed in Creating a Windows PowerShell Item Provider.

protected override bool HasChildItems( string path )
{
    return false;
} // HasChildItems
        ErrorCategory.InvalidOperation, tableName));
}

return results;

Aspectos que se deben recordar sobre la implementación de HasChildItemsThings to Remember About Implementing HasChildItems

Se pueden aplicar las siguientes condiciones a su implementación de System. Management. Automation. Provider. Containercmdletprovider. Haschilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*:

Copiar elementosCopying Items

Para copiar elementos, el proveedor de contenedores debe implementar el método System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem para admitir llamadas del Copy-Item cmdlet.To copy items, the container provider must implement the System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem method to support calls from the Copy-Item cmdlet. Este método copia un elemento de datos de la ubicación indicada por el path parámetro del cmdlet en la ubicación indicada por el copyPath parámetro.This method copies a data item from the location indicated by the path parameter of the cmdlet to the location indicated by the copyPath parameter. Si recurse se especifica el parámetro, el método copia todos los subcontenedores.If the recurse parameter is specified, the method copies all sub-containers. Si no se especifica el parámetro, el método copia solo un único nivel de elementos.If the parameter is not specified, the method copies only a single level of items.

Este proveedor no implementa este método.This provider does not implement this method. Sin embargo, el código siguiente es la implementación predeterminada de System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem.However, the following code is the default implementation of System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Aspectos que se deben recordar sobre la implementación de CopyItemThings to Remember About Implementing CopyItem

Las condiciones siguientes pueden aplicarse a su implementación de System. Management. Automation. Provider. ContainerCmdletProvider. CopyItem:The following conditions may apply to your implementation of System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:

Adjuntar parámetros dinámicos al cmdlet Copy-ItemAttaching Dynamic Parameters to the Copy-Item Cmdlet

A veces, el Copy-Item cmdlet requiere parámetros adicionales que se especifican dinámicamente en tiempo de ejecución.Sometimes the Copy-Item cmdlet requires additional parameters that are specified dynamically at runtime. Para proporcionar estos parámetros dinámicos, el proveedor de contenedores de Windows PowerShell debe implementar el método System. Management. Automation. Provider. Containercmdletprovider. Copyitemdynamicparameters * para administrar estos parámetros.To provide these dynamic parameters, the Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* method to handle these parameters. Este método recupera los parámetros para el elemento en la ruta de acceso indicada y devuelve un objeto que tiene propiedades y campos con los atributos de análisis similares a una clase de cmdlet o un objeto System. Management. Automation. Runtimedefinedparameterdictionary .This method retrieves the parameters for the item at the indicated path and returns an object that has properties and fields with parsing attributes similar to a cmdlet class or a System.Management.Automation.Runtimedefinedparameterdictionary object. El tiempo de ejecución de Windows PowerShell usa el objeto devuelto para agregar los parámetros al Copy-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Copy-Item cmdlet.

Este proveedor no implementa este método.This provider does not implement this method. Sin embargo, el código siguiente es la implementación predeterminada de System. Management. Automation. Provider. Containercmdletprovider. Copyitemdynamicparameters *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.

Ejemplo de códigoCode Sample

Para obtener el código de ejemplo completo, vea el ejemplo de código AccessDbProviderSample04.For complete sample code, see AccessDbProviderSample04 Code Sample.

Compilar el proveedor de Windows PowerShellBuilding the Windows PowerShell Provider

Vea Cómo registrar cmdlets, proveedores y aplicaciones host.See How to Register Cmdlets, Providers, and Host Applications.

Probar el proveedor de Windows PowerShellTesting the Windows PowerShell Provider

Cuando el proveedor de Windows PowerShell se ha registrado con Windows PowerShell, puede probarlo mediante la ejecución de los cmdlets admitidos en la línea de comandos.When your Windows PowerShell provider has been registered with Windows PowerShell, you can test it by running the supported cmdlets on the command line. Tenga en cuenta que en la siguiente salida de ejemplo se utiliza una base de datos de Access ficticia.Be aware that the following example output uses a fictitious Access database.

  1. Ejecute el Get-ChildItem cmdlet para recuperar la lista de elementos secundarios de una tabla Customers en la base de datos de Access.Run the Get-ChildItem cmdlet to retrieve the list of child items from a Customers table in the Access database.

    Get-ChildItem mydb:customers
    

    Aparece el siguiente resultado.The following output appears.

    PSPath        : AccessDB::customers
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : True
    Data          : System.Data.DataRow
    Name          : Customers
    RowCount      : 91
    Columns       :
    
  2. Get-ChildItemVuelva a ejecutar el cmdlet para recuperar los datos de una tabla.Run the Get-ChildItem cmdlet again to retrieve the data of a table.

    (Get-ChildItem mydb:customers).data
    

    Aparece el siguiente resultado.The following output appears.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. Ahora use el Get-Item cmdlet para recuperar los elementos de la fila 0 en la tabla de datos.Now use the Get-Item cmdlet to retrieve the items at row 0 in the data table.

    Get-Item mydb:\customers\0
    

    Aparece el siguiente resultado.The following output appears.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Reutilización Get-Item para recuperar los datos de los elementos de la fila 0.Reuse Get-Item to retrieve the data for the items in row 0.

    (Get-Item mydb:\customers\0).data
    

    Aparece el siguiente resultado.The following output appears.

    CustomerID   : 1234
    CompanyName  : Fabrikam
    ContactName  : Eric Gruber
    ContactTitle : President
    Address      : 4567 Main Street
    City         : Buffalo
    Region       : NY
    PostalCode   : 98052
    Country      : USA
    Phone        : (425) 555-0100
    Fax          : (425) 555-0101
    
  5. Ahora use el New-Item cmdlet para agregar una fila a una tabla existente.Now use the New-Item cmdlet to add a row to an existing table. El Path parámetro especifica la ruta de acceso completa a la fila y debe indicar un número de fila mayor que el número de filas existente en la tabla.The Path parameter specifies the full path to the row, and must indicate a row number that is greater than the existing number of rows in the table. El Type parámetro indica "Row" para especificar el tipo de elemento que se va a agregar.The Type parameter indicates "row" to specify that type of item to add. Por último, el Value parámetro especifica una lista delimitada por comas de valores de columna de la fila.Finally, the Value parameter specifies a comma-delimited list of column values for the row.

    New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
    
  6. Compruebe la corrección de la operación del nuevo elemento como se indica a continuación.Verify the correctness of the new item operation as follows.

    PS mydb:\> cd Customers
    PS mydb:\Customers> (Get-Item 3).data
    

    Aparece el siguiente resultado.The following output appears.

    ID        : 3
    FirstName : Eric
    LastName  : Gruber
    Email     : ericgruber@fabrikam.com
    Title     : President
    Company   : Fabrikam
    WorkPhone : (425) 555-0100
    Address   : 4567 Main Street
    City      : Buffalo
    State     : NY
    Zip       : 98052
    Country   : USA
    

Consulte tambiénSee Also

Crear proveedores de Windows PowerShellCreating Windows PowerShell Providers

Diseño del proveedor de Windows PowerShellDesigning Your Windows PowerShell Provider

Implementar un elemento proveedor de Windows PowerShellImplementing an Item Windows PowerShell Provider

Implementar un proveedor de navegación de Windows PowerShellImplementing a Navigation Windows PowerShell Provider

Cómo registrar cmdlets, proveedores y aplicaciones hostHow to Register Cmdlets, Providers, and Host Applications

Windows PowerShell SDKWindows PowerShell SDK

Guía del programador de Windows PowerShellWindows PowerShell Programmer's Guide