Creazione di un provider di contenitori di Windows PowerShellCreating a Windows PowerShell Container Provider

In questo argomento viene descritto come creare un provider di Windows PowerShell in grado di funzionare in archivi dati a più livelli.This topic describes how to create a Windows PowerShell provider that can work on multi-layer data stores. Per questo tipo di archivio dati, il livello principale dell'archivio contiene gli elementi radice e ogni livello successivo viene definito nodo di elementi figlio.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. Consentendo all'utente di lavorare su questi nodi figlio, un utente può interagire gerarchicamente con l'archivio dati.By allowing the user to work on these child nodes, a user can interact hierarchically through the data store.

I provider che possono usare gli archivi dati a più livelli sono detti provider di contenitori di Windows PowerShell.Providers that can work on multi-level data stores are referred to as Windows PowerShell container providers. Tuttavia, tenere presente che un provider di contenitori di Windows PowerShell può essere utilizzato solo quando è presente un contenitore (nessun contenitore annidato) con elementi.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. Se sono presenti contenitori annidati, è necessario implementare un provider di navigazione di Windows PowerShell.If there are nested containers, then you must implement a Windows PowerShell navigation provider. Per ulteriori informazioni sull'implementazione del provider di navigazione di Windows PowerShell, vedere creazione di un provider di navigazione di Windows PowerShell.For more information about implementing Windows PowerShell navigation provider, see Creating a Windows PowerShell Navigation Provider.

Nota

È possibile scaricare il file di origine C# (AccessDBSampleProvider04.cs) per questo provider utilizzando Microsoft Windows Software Development Kit per i componenti di runtime di Windows Vista e .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. Per istruzioni sul download, vedere come installare Windows PowerShell e scaricare Windows PowerShell SDK.For download instructions, see How to Install Windows PowerShell and Download the Windows PowerShell SDK. I file di origine scaricati sono disponibili nella <PowerShell Samples> Directory.The downloaded source files are available in the <PowerShell Samples> directory. Per ulteriori informazioni sulle altre implementazioni del provider di Windows PowerShell, vedere progettazione del provider di Windows PowerShell.For more information about other Windows PowerShell provider implementations, see Designing Your Windows PowerShell Provider.

Il provider di contenitori di Windows PowerShell descritto di seguito definisce il database come singolo contenitore, con le tabelle e le righe del database definite come elementi del contenitore.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.

Attenzione

Tenere presente che questa progettazione presuppone che il database disponga di un campo con ID nome e che il tipo del campo sia 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.

Definizione di una classe del provider di contenitori di Windows PowerShellDefining a Windows PowerShell Container Provider Class

Un provider di contenitori di Windows PowerShell deve definire una classe .NET che deriva dalla classe di 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. Ecco la definizione della classe per il provider di contenitori di Windows PowerShell descritta in questa sezione.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

Si noti che in questa definizione di classe l'attributo System. Management. Automation. provider. CmdletProviderAttribute include due parametri.Notice that in this class definition, the System.Management.Automation.Provider.Cmdletproviderattribute attribute includes two parameters. Il primo parametro specifica un nome descrittivo per il provider utilizzato da Windows PowerShell.The first parameter specifies a user-friendly name for the provider that is used by Windows PowerShell. Il secondo parametro specifica le funzionalità specifiche di Windows PowerShell che il provider espone al runtime di Windows PowerShell durante l'elaborazione del comando.The second parameter specifies the Windows PowerShell specific capabilities that the provider exposes to the Windows PowerShell runtime during command processing. Per questo provider non sono state aggiunte funzionalità specifiche di Windows PowerShell.For this provider, there are no Windows PowerShell specific capabilities that are added.

Definizione della funzionalità di baseDefining Base Functionality

Come descritto in progettazione del provider di Windows PowerShell, la classe System. Management. Automation. provider. Containercmdletprovider deriva da diverse altre classi che forniscono diverse funzionalità del provider.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. Un provider di contenitori di Windows PowerShell deve quindi definire tutte le funzionalità fornite da tali classi.A Windows PowerShell container provider, therefore, needs to define all of the functionality provided by those classes.

Per implementare la funzionalità per l'aggiunta di informazioni di inizializzazione specifiche della sessione e per il rilascio di risorse utilizzate dal provider, vedere creazione di un provider di Windows PowerShell di base.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. Tuttavia, la maggior parte dei provider (incluso il provider descritto qui) può usare l'implementazione predefinita di questa funzionalità fornita da Windows PowerShell.However, most providers (including the provider described here) can use the default implementation of this functionality that is provided by Windows PowerShell.

Per ottenere l'accesso all'archivio dati, il provider deve implementare i metodi della classe di 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. Per ulteriori informazioni sull'implementazione di questi metodi, vedere creazione di un provider di unità di Windows PowerShell.For more information about implementing these methods, see Creating an Windows PowerShell Drive Provider.

Per modificare gli elementi di un archivio dati, ad esempio per ottenere, impostare e cancellare elementi, il provider deve implementare i metodi forniti dalla classe di 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. Per ulteriori informazioni sull'implementazione di questi metodi, vedere creazione di un provider di elementi di Windows PowerShell.For more information about implementing these methods, see Creating an Windows PowerShell Item Provider.

Recupero di elementi figlioRetrieving Child Items

Per recuperare un elemento figlio, il provider di contenitori di Windows PowerShell deve eseguire l'override del metodo System. Management. Automation. provider. Containercmdletprovider. getchilditems * per supportare le chiamate dal 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. Questo metodo recupera gli elementi figlio dall'archivio dati e li scrive nella pipeline come oggetti.This method retrieves child items from the data store and writes them to the pipeline as objects. Se recurse viene specificato il parametro del cmdlet, il metodo recupera tutti gli elementi figlio indipendentemente dal livello in cui si trovano.If the recurse parameter of the cmdlet is specified, the method retrieves all children regardless of what level they are at. Se il recurse parametro non è specificato, il metodo recupera solo un singolo livello di elementi figlio.If the recurse parameter is not specified, the method retrieves only a single level of children.

Di seguito è illustrata l'implementazione del metodo System. Management. Automation. provider. Containercmdletprovider. getchilditems * per questo provider.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* method for this provider. Si noti che questo metodo recupera gli elementi figlio in tutte le tabelle del database quando il percorso indica il database di Access e recupera gli elementi figlio dalle righe di tale tabella se il percorso indica una tabella di dati.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

Aspetti da ricordare sull'implementazione di GetChildItemThings to Remember About Implementing GetChildItems

Le condizioni seguenti possono essere valide per l'implementazione di System. Management. Automation. provider. Containercmdletprovider. getchilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Associazione di parametri dinamici al cmdlet Get-ChildItemAttaching Dynamic Parameters to the Get-ChildItem Cmdlet

A volte il Get-ChildItem cmdlet che chiama System. Management. Automation. provider. Containercmdletprovider. GetChildItem * richiede parametri aggiuntivi che vengono specificati dinamicamente in fase di esecuzione.Sometimes the Get-ChildItem cmdlet that calls System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* requires additional parameters that are specified dynamically at runtime. Per fornire questi parametri dinamici, il provider di contenitori di Windows PowerShell deve implementare il metodo 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. Questo metodo recupera i parametri dinamici per l'elemento in corrispondenza del percorso indicato e restituisce un oggetto con proprietà e campi con attributi di analisi simili a una classe di cmdlet o a un oggetto 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. Il runtime di Windows PowerShell usa l'oggetto restituito per aggiungere i parametri al Get-ChildItem cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Get-ChildItem cmdlet.

Questo provider di contenitori di Windows PowerShell non implementa questo metodo.This Windows PowerShell container provider does not implement this method. Tuttavia, il codice seguente è l'implementazione predefinita di questo metodo.However, the following code is the default implementation of this method.

Recupero dei nomi degli elementi figlioRetrieving Child Item Names

Per recuperare i nomi degli elementi figlio, il provider di contenitori di Windows PowerShell deve eseguire l'override del metodo System. Management. Automation. provider. Containercmdletprovider. Getchildnames * per supportare le chiamate dal Get-ChildItem cmdlet quando Name viene specificato il relativo parametro.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. Questo metodo recupera i nomi degli elementi figlio per il percorso o i nomi degli elementi figlio specificati per tutti i contenitori se returnAllContainers viene specificato il parametro 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 nome figlio è la parte foglia di un percorso.A child name is the leaf portion of a path. Ad esempio, il nome figlio per il percorso c:\windows\system32\abc.dll è "abc.dll".For example, the child name for the path c:\windows\system32\abc.dll is "abc.dll". Il nome figlio per la directory c:\Windows\System32 è "system32".The child name for the directory c:\windows\system32 is "system32".

Di seguito è illustrata l'implementazione del metodo System. Management. Automation. provider. Containercmdletprovider. Getchildnames * per questo provider.Here is the implementation of the System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* method for this provider. Si noti che il metodo recupera i nomi di tabella se il percorso specificato indica il database di Access (unità) e i numeri di riga se il percorso indica una tabella.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

Aspetti da ricordare sull'implementazione di GetChildNamesThings to Remember About Implementing GetChildNames

Le condizioni seguenti possono essere valide per l'implementazione di System. Management. Automation. provider. Containercmdletprovider. getchilditems *:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:

Associazione di parametri dinamici al cmdlet Get-ChildItem (nome)Attaching Dynamic Parameters to the Get-ChildItem Cmdlet (Name)

A volte il Get-ChildItem cmdlet (con il Name parametro) richiede parametri aggiuntivi specificati dinamicamente in fase di esecuzione.Sometimes the Get-ChildItem cmdlet (with the Name parameter) requires additional parameters that are specified dynamically at runtime. Per fornire questi parametri dinamici, il provider di contenitori di Windows PowerShell deve implementare il metodo 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. Questo metodo recupera i parametri dinamici per l'elemento in corrispondenza del percorso indicato e restituisce un oggetto con proprietà e campi con attributi di analisi simili a una classe di cmdlet o a un oggetto 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. Il runtime di Windows PowerShell usa l'oggetto restituito per aggiungere i parametri al Get-ChildItem cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Get-ChildItem cmdlet.

Questo provider non implementa questo metodo.This provider does not implement this method. Tuttavia, il codice seguente è l'implementazione predefinita di questo metodo.However, the following code is the default implementation of this method.

Ridenominazione di elementiRenaming Items

Per rinominare un elemento, un provider di contenitori di Windows PowerShell deve eseguire l'override del metodo System. Management. Automation. provider. Containercmdletprovider. RenameItem * per supportare le chiamate dal 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. Questo metodo modifica il nome dell'elemento in corrispondenza del percorso specificato con il nuovo nome fornito.This method changes the name of the item at the specified path to the new name provided. Il nuovo nome deve essere sempre relativo all'elemento padre (contenitore).The new name must always be relative to the parent item (container).

Questo provider non esegue l'override del metodo System. Management. Automation. provider. Containercmdletprovider. RenameItem * .This provider does not override the System.Management.Automation.Provider.Containercmdletprovider.Renameitem* method. Tuttavia, di seguito è riportata l'implementazione predefinita.However, the following is the default implementation.

Aspetti da ricordare sull'implementazione di RenameItemThings to Remember About Implementing RenameItem

Per l'implementazione di System. Management. Automation. provider. Containercmdletprovider. RenameItem *è possibile che si verifichino le condizioni seguenti:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Renameitem*:

Associazione di parametri dinamici al cmdlet Rename-ItemAttaching Dynamic Parameters to the Rename-Item Cmdlet

A volte il Rename-Item cmdlet richiede parametri aggiuntivi che vengono specificati dinamicamente in fase di esecuzione.Sometimes the Rename-Item cmdlet requires additional parameters that are specified dynamically at runtime. Per fornire questi parametri dinamici, il provider di contenitori di Windows PowerShell deve implementare il metodo 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. Questo metodo recupera i parametri per l'elemento in corrispondenza del percorso indicato e restituisce un oggetto con proprietà e campi con attributi di analisi simili a una classe di cmdlet o a un oggetto 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. Il runtime di Windows PowerShell usa l'oggetto restituito per aggiungere i parametri al Rename-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Rename-Item cmdlet.

Questo provider di contenitori non implementa questo metodo.This container provider does not implement this method. Tuttavia, il codice seguente è l'implementazione predefinita di questo metodo.However, the following code is the default implementation of this method.

Creazione di nuovi elementiCreating New Items

Per creare nuovi elementi, un provider di contenitori deve implementare il metodo System. Management. Automation. provider. Containercmdletprovider. NewItem * per supportare le chiamate dal 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. Questo metodo crea un elemento di dati che si trova nel percorso specificato.This method creates a data item located at the specified path. Il type parametro del cmdlet contiene il tipo definito dal provider per il nuovo elemento.The type parameter of the cmdlet contains the provider-defined type for the new item. Ad esempio, il provider FileSystem usa un type parametro con un valore "file" o "directory".For example, the FileSystem provider uses a type parameter with a value of "file" or "directory". Il newItemValue parametro del cmdlet specifica un valore specifico del provider per il nuovo elemento.The newItemValue parameter of the cmdlet specifies a provider-specific value for the new item.

Di seguito è illustrata l'implementazione del metodo System. Management. Automation. provider. Containercmdletprovider. NewItem * per questo provider.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];

Aspetti da ricordare sull'implementazione di NewItemThings to Remember About Implementing NewItem

Per l'implementazione di System. Management. Automation. provider. Containercmdletprovider. NewItem *è possibile che si verifichino le condizioni seguenti:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Associazione di parametri dinamici al cmdlet New-ItemAttaching Dynamic Parameters to the New-Item Cmdlet

A volte il New-Item cmdlet richiede parametri aggiuntivi che vengono specificati dinamicamente in fase di esecuzione.Sometimes the New-Item cmdlet requires additional parameters that are specified dynamically at runtime. Per fornire questi parametri dinamici, il provider di contenitori deve implementare il metodo System. Management. Automation. provider. Containercmdletprovider. Newitemdynamicparameters * .To provide these dynamic parameters, the container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* method. Questo metodo recupera i parametri per l'elemento in corrispondenza del percorso indicato e restituisce un oggetto con proprietà e campi con attributi di analisi simili a una classe di cmdlet o a un oggetto 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. Il runtime di Windows PowerShell usa l'oggetto restituito per aggiungere i parametri al New-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the New-Item cmdlet.

Questo provider non implementa questo metodo.This provider does not implement this method. Tuttavia, il codice seguente è l'implementazione predefinita di questo metodo.However, the following code is the default implementation of this method.

Rimozione di elementiRemoving Items

Per rimuovere gli elementi, il provider di Windows PowerShell deve eseguire l'override del metodo System. Management. Automation. provider. Containercmdletprovider. RemoveItem * per supportare le chiamate dal 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. Questo metodo elimina un elemento dall'archivio dati nel percorso specificato.This method deletes an item from the data store at the specified path. Se il recurse parametro del Remove-Item cmdlet è impostato su true , il metodo rimuove tutti gli elementi figlio indipendentemente dal relativo livello.If the recurse parameter of the Remove-Item cmdlet is set to true, the method removes all child items regardless of their level. Se il parametro è impostato su false , il metodo rimuove solo un singolo elemento nel percorso specificato.If the parameter is set to false, the method removes only a single item at the specified path.

Questo provider non supporta la rimozione di elementi.This provider does not support item removal. Tuttavia, il codice seguente è l'implementazione predefinita di System. Management. Automation. provider. Containercmdletprovider. RemoveItem *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.

Aspetti da ricordare sull'implementazione di RemoveItemThings to Remember About Implementing RemoveItem

Per l'implementazione di System. Management. Automation. provider. Containercmdletprovider. NewItem *è possibile che si verifichino le condizioni seguenti:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Newitem*:

Associazione di parametri dinamici al cmdlet Remove-ItemAttaching Dynamic Parameters to the Remove-Item Cmdlet

A volte il Remove-Item cmdlet richiede parametri aggiuntivi che vengono specificati dinamicamente in fase di esecuzione.Sometimes the Remove-Item cmdlet requires additional parameters that are specified dynamically at runtime. Per fornire questi parametri dinamici, il provider di contenitori deve implementare il metodo System. Management. Automation. provider. Containercmdletprovider. Removeitemdynamicparameters * per gestire questi parametri.To provide these dynamic parameters, the container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* method to handle these parameters. Questo metodo recupera i parametri dinamici per l'elemento in corrispondenza del percorso indicato e restituisce un oggetto con proprietà e campi con attributi di analisi simili a una classe di cmdlet o a un oggetto 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. Il runtime di Windows PowerShell usa l'oggetto restituito per aggiungere i parametri al Remove-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Remove-Item cmdlet.

Questo provider di contenitori non implementa questo metodo.This container provider does not implement this method. Tuttavia, il codice seguente è l'implementazione predefinita di System. Management. Automation. provider. Containercmdletprovider. Removeitemdynamicparameters *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.

Esecuzione di query per gli elementi figlioQuerying for Child Items

Per verificare se esistono elementi figlio nel percorso specificato, il provider di contenitori di Windows PowerShell deve eseguire l'override del metodo 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. Questo metodo restituisce true se l'elemento ha elementi figlio e false in caso contrario.This method returns true if the item has children, and false otherwise. Per un percorso null o vuoto, il metodo considera gli elementi dell'archivio dati come elementi figlio e restituisce true .For a null or empty path, the method considers any items in the data store to be children and returns true.

Di seguito è riportato l'override per il metodo System. Management. Automation. provider. Containercmdletprovider. Haschilditems * .Here is the override for the System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* method. Se sono presenti più di due parti del percorso create dal metodo helper ChunkPath, il metodo restituisce false , poiché vengono definiti solo un contenitore di database e un contenitore di tabelle.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. Per ulteriori informazioni su questo metodo helper, vedere il metodo ChunkPath descritto in creazione di un provider di elementi di 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;

Aspetti da ricordare sull'implementazione di HasChildItemsThings to Remember About Implementing HasChildItems

Per l'implementazione di System. Management. Automation. provider. Containercmdletprovider. Haschilditems *è possibile che si verifichino le condizioni seguenti:The following conditions may apply to your implementation of System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*:

Copia di elementiCopying Items

Per copiare gli elementi, il provider di contenitori deve implementare il metodo System. Management. Automation. provider. ContainerCmdletProvider. CopyItem per supportare le chiamate dal 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. Questo metodo copia un elemento dati dal percorso indicato dal path parametro del cmdlet alla posizione indicata dal copyPath parametro.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. Se il recurse parametro viene specificato, il metodo copia tutti i contenitori secondari.If the recurse parameter is specified, the method copies all sub-containers. Se il parametro non è specificato, il metodo copia solo un singolo livello di elementi.If the parameter is not specified, the method copies only a single level of items.

Questo provider non implementa questo metodo.This provider does not implement this method. Tuttavia, il codice seguente è l'implementazione predefinita di System. Management. Automation. provider. ContainerCmdletProvider. CopyItem.However, the following code is the default implementation of System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.

Aspetti da ricordare sull'implementazione di CopyItemThings to Remember About Implementing CopyItem

Le condizioni seguenti possono essere valide per l'implementazione di System. Management. Automation. provider. ContainerCmdletProvider. CopyItem:The following conditions may apply to your implementation of System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:

Associazione di parametri dinamici al cmdlet Copy-ItemAttaching Dynamic Parameters to the Copy-Item Cmdlet

A volte il Copy-Item cmdlet richiede parametri aggiuntivi che vengono specificati dinamicamente in fase di esecuzione.Sometimes the Copy-Item cmdlet requires additional parameters that are specified dynamically at runtime. Per fornire questi parametri dinamici, il provider di contenitori di Windows PowerShell deve implementare il metodo System. Management. Automation. provider. Containercmdletprovider. Copyitemdynamicparameters * per gestire questi parametri.To provide these dynamic parameters, the Windows PowerShell container provider must implement the System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* method to handle these parameters. Questo metodo recupera i parametri per l'elemento in corrispondenza del percorso indicato e restituisce un oggetto con proprietà e campi con attributi di analisi simili a una classe di cmdlet o a un oggetto 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. Il runtime di Windows PowerShell usa l'oggetto restituito per aggiungere i parametri al Copy-Item cmdlet.The Windows PowerShell runtime uses the returned object to add the parameters to the Copy-Item cmdlet.

Questo provider non implementa questo metodo.This provider does not implement this method. Tuttavia, il codice seguente è l'implementazione predefinita di System. Management. Automation. provider. Containercmdletprovider. Copyitemdynamicparameters *.However, the following code is the default implementation of System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.

Codice di esempioCode Sample

Per il codice di esempio completo, vedere esempio di codice AccessDbProviderSample04.For complete sample code, see AccessDbProviderSample04 Code Sample.

Compilazione del provider di Windows PowerShellBuilding the Windows PowerShell Provider

Vedere come registrare i cmdlet, i provider e le applicazioni host.See How to Register Cmdlets, Providers, and Host Applications.

Test del provider di Windows PowerShellTesting the Windows PowerShell Provider

Quando il provider di Windows PowerShell è stato registrato con Windows PowerShell, è possibile testarlo eseguendo i cmdlet supportati dalla riga di comando.When your Windows PowerShell provider has been registered with Windows PowerShell, you can test it by running the supported cmdlets on the command line. Tenere presente che l'output di esempio seguente usa un database di Access fittizio.Be aware that the following example output uses a fictitious Access database.

  1. Eseguire il Get-ChildItem cmdlet per recuperare l'elenco di elementi figlio da una tabella Customers nel database di 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
    

    Viene visualizzato l'output seguente.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. Eseguire Get-ChildItem di nuovo il cmdlet per recuperare i dati di una tabella.Run the Get-ChildItem cmdlet again to retrieve the data of a table.

    (Get-ChildItem mydb:customers).data
    

    Viene visualizzato l'output seguente.The following output appears.

    TABLE_CAT   : c:\PS\northwind
    TABLE_SCHEM :
    TABLE_NAME  : Customers
    TABLE_TYPE  : TABLE
    REMARKS     :
    
  3. A questo punto Get-Item , usare il cmdlet per recuperare gli elementi alla riga 0 nella tabella dati.Now use the Get-Item cmdlet to retrieve the items at row 0 in the data table.

    Get-Item mydb:\customers\0
    

    Viene visualizzato l'output seguente.The following output appears.

    PSPath        : AccessDB::customers\0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data          : System.Data.DataRow
    RowNumber     : 0
    
  4. Riuso Get-Item per recuperare i dati per gli elementi nella riga 0.Reuse Get-Item to retrieve the data for the items in row 0.

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

    Viene visualizzato l'output seguente.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. A questo punto New-Item , usare il cmdlet per aggiungere una riga a una tabella esistente.Now use the New-Item cmdlet to add a row to an existing table. Il Path parametro specifica il percorso completo della riga e deve indicare un numero di riga maggiore del numero di righe esistente nella tabella.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. Il Type parametro indica "Row" per specificare il tipo di elemento da aggiungere.The Type parameter indicates "row" to specify that type of item to add. Infine, il Value parametro specifica un elenco delimitato da virgole di valori di colonna per la riga.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. Verificare la correttezza dell'operazione del nuovo elemento come indicato di seguito.Verify the correctness of the new item operation as follows.

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

    Viene visualizzato l'output seguente.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
    

Vedere ancheSee Also

Creazione di provider di Windows PowerShellCreating Windows PowerShell Providers

Progettazione del provider di Windows PowerShellDesigning Your Windows PowerShell Provider

Implementazione di un provider di Windows PowerShell per elementiImplementing an Item Windows PowerShell Provider

Implementazione di un provider di Windows PowerShell per la navigazioneImplementing a Navigation Windows PowerShell Provider

Come registrare cmdlet, provider e applicazioni hostHow to Register Cmdlets, Providers, and Host Applications

Windows PowerShell SDKWindows PowerShell SDK

Manuale del programmatore di Windows PowerShellWindows PowerShell Programmer's Guide