Condividi tramite


Creazione di un provider di oggetti PowerShell per Windows

Questo argomento descrive come creare un provider PowerShell di Windows che possa manipolare i dati in uno store dati. In questo argomento, gli elementi di dati nello store sono chiamati "elementi" dello store dati. Di conseguenza, un provider che può manipolare i dati nello store è chiamato provider di oggetti Windows PowerShell.

Annotazioni

Puoi scaricare il file sorgente C# (AccessDBSampleProvider03.cs) di questo fornitore utilizzando il Microsoft Windows Software Development Kit per Windows Vista e i componenti runtime di .NET Framework 3.0. Per le istruzioni per il download, consulta Come installare Windows PowerShell e scaricare l'SDK di Windows PowerShell. I file sorgente scaricati sono disponibili nella PowerShell Samples directory. Per maggiori informazioni su altre implementazioni di provider PowerShell di Windows, vedi Progettare il tuo provider PowerShell Windows.

Il provider di elementi PowerShell di Windows descritto in questo argomento ottiene elementi di dati da un database Access. In questo caso, un "elemento" è o una tabella nel database Access o una riga in una tabella.

Definizione della classe provider di oggetti PowerShell di Windows

Un provider di elementi Windows PowerShell deve definire una classe .NET che derivi dalla classe base System.Management.Automation.Provider.ItemCmdletProvider . Di seguito è riportata la definizione di classe per il fornitore di item descritto in questa sezione.

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

public class AccessDBProvider : ItemCmdletProvider

Si noti che in questa definizione di classe, l'attributo System.Management.Automation.Provider.CmdletProviderAttribute include due parametri. Il primo parametro specifica un nome user-friendly per il provider utilizzato da Windows PowerShell. Il secondo parametro specifica le capacità specifiche di Windows PowerShell che il provider espone all'runtime di Windows PowerShell durante l'elaborazione dei comandi. Per questo fornitore, non ci sono funzionalità aggiuntive specifiche di PowerShell per Windows.

Definizione della funzionalità di base

Come descritto in Design Your Windows PowerShell Provider, la classe System.Management.Automation.Provider.DriveCmdletProvider deriva da diverse altre classi che offrivano funzionalità provider diverse. Un provider di oggetti PowerShell di Windows, quindi, deve definire tutte le funzionalità fornite da quelle classi.

Per maggiori informazioni su come implementare funzionalità per aggiungere informazioni di inizializzazione specifiche per sessione e per rilasciare risorse utilizzate dal provider, vedi Creare un fornitore base di PowerShell per Windows. Tuttavia, la maggior parte dei provider, incluso quello descritto qui, può utilizzare l'implementazione predefinita di questa funzionalità fornita da Windows PowerShell.

Prima che il provider di oggetti PowerShell di Windows possa manipolare gli elementi nello store, deve implementare i metodi della classe base System.Management.Automation.Provider.DriveCmdletProvider per accedere allo store dati. Per maggiori informazioni sull'implementazione di questa classe, vedi Creare un provider di unità PowerShell per Windows.

Verifica della validità del percorso

Quando si cerca un dato, il runtime di Windows PowerShell fornisce un percorso PowerShell di Windows al provider, come definito nella sezione "PSPath Concepts" di Come funziona Windows PowerShell. Un fornitore di elementi PowerShell di Windows deve verificare la validità sintattica e semantica di qualsiasi percorso a lui passato implementando il metodo System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Questo metodo restituisce true se il percorso è valido, e false altrimenti. Tieni presente che l'implementazione di questo metodo non dovrebbe verificare l'esistenza dell'elemento nel percorso, ma solo che il percorso sia sintatticamente e semanticamente corretto.

Ecco l'implementazione del metodo System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath per questo fornitore. Si noti che questa implementazione chiama un metodo helper NormalizePath per convertire tutti i separatori nel percorso in uno uniforme.

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

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

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

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

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

Determinare se un oggetto esiste

Dopo aver verificato il percorso, l'runtime di Windows PowerShell deve determinare se un dato esiste in quel percorso. Per supportare questo tipo di query, il provider di oggetti PowerShell di Windows implementa il metodo System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Questo metodo restituisce true un elemento trovato nel percorso specificato e false (di default) altrimenti.

Ecco l'implementazione del metodo System.Management.Automation.Provider.ItemCmdletProvider.ItemExists per questo fornitore. Si noti che questo metodo chiama i metodi helper PathIsDrive, ChunkPath e GetTable e utilizza un oggetto DatabaseTableInfo definito dal fornitore.

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

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

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

    DatabaseTableInfo table = GetTable(tableName);

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

    return false;

} // ItemExists

Cose da ricordare sull'implementazione di ItemExists

Le seguenti condizioni possono applicarsi alla tua implementazione di System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Aggiunta dei parametri dinamici al cmdlet Test-Path

A volte il Test-Path cmdlet che chiama System.Management.Automation.Provider.ItemCmdletProvider.ItemExists richiede parametri aggiuntivi specificati dinamicamente in runtime. Per fornire questi parametri dinamici, il fornitore di elementi PowerShell di Windows deve implementare il metodo System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters . Questo metodo recupera i parametri dinamici dell'elemento sul percorso indicato e restituisce un oggetto che possiede proprietà e campi con attributi di analisi simili a una classe cmdlet o a un oggetto System.Management.Automation.RuntimeDefinedParameterDictionary . L'runtime di Windows PowerShell utilizza l'oggetto restituito per aggiungere i parametri al Test-Path cmdlet.

Questo fornitore di elementi di Windows PowerShell non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di questo metodo.

Recupero di un oggetto

Per recuperare un elemento, il provider di oggetti PowerShell di Windows deve sovrascrivere il metodo System.Management.Automation.Provider.ItemCmdletProvider.GetItem per supportare le chiamate dal Get-Item cmdlet. Questo metodo scrive l'elemento utilizzando il metodo System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Ecco l'implementazione del metodo System.Management.Automation.Provider.ItemCmdletProvider.GetItem per questo fornitore. Si noti che questo metodo utilizza i metodi helper GetTable e GetRow per recuperare elementi che sono o tabelle nel database Access o righe in una tabella dati.

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

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

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

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

 } // GetItem

Cose da ricordare sull'implementazione di GetItem

Le seguenti condizioni possono applicarsi a un'implementazione di System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Aggiunta dei parametri dinamici al cmdlet Get-Item

A volte il Get-Item cmdlet richiede parametri aggiuntivi specificati dinamicamente a runtime. Per fornire questi parametri dinamici, il fornitore di elementi PowerShell di Windows deve implementare il metodo System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters . Questo metodo recupera i parametri dinamici dell'elemento sul percorso indicato e restituisce un oggetto che possiede proprietà e campi con attributi di analisi simili a una classe cmdlet o a un oggetto System.Management.Automation.RuntimeDefinedParameterDictionary . L'runtime di Windows PowerShell utilizza l'oggetto restituito per aggiungere i parametri al Get-Item cmdlet.

Questo fornitore non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di questo metodo.

Impostare un oggetto

Per impostare un elemento, il provider di elementi PowerShell di Windows deve sovrascrivere il metodo System.Management.Automation.Provider.ItemCmdletProvider.SetItem per supportare le chiamate dal Set-Item cmdlet. Questo metodo stabilisce il valore dell'oggetto sul percorso specificato.

Questo provider non fornisce una sovrascrittura per il metodo System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Tuttavia, di seguito è l'implementazione predefinita di questo metodo.

Cose da ricordare sull'implementazione di SetItem

Le seguenti condizioni possono applicarsi alla tua implementazione di System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Recupero dei parametri dinamici per SetItem

A volte il Set-Item cmdlet richiede parametri aggiuntivi specificati dinamicamente a runtime. Per fornire questi parametri dinamici, il fornitore di elementi PowerShell di Windows deve implementare il metodo System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters . Questo metodo recupera i parametri dinamici dell'elemento sul percorso indicato e restituisce un oggetto che possiede proprietà e campi con attributi di analisi simili a una classe cmdlet o a un oggetto System.Management.Automation.RuntimeDefinedParameterDictionary . L'runtime di Windows PowerShell utilizza l'oggetto restituito per aggiungere i parametri al Set-Item cmdlet.

Questo fornitore non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di questo metodo.

Eliminazione di un oggetto

Per cancellare un elemento, il provider di elementi PowerShell di Windows implementa il metodo System.Management.Automation.Provider.ItemCmdletProvider.ClearItem per supportare le chiamate dal Clear-Item cmdlet. Questo metodo cancella l'elemento dati sul percorso specificato.

Questo fornitore non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di questo metodo.

Cose da ricordare sull'implementazione di ClearItem

Le seguenti condizioni possono applicarsi a un'implementazione di System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Recupero parametri dinamici per ClearItem

A volte il Clear-Item cmdlet richiede parametri aggiuntivi specificati dinamicamente a runtime. Per fornire questi parametri dinamici, il provider di item di Windows PowerShell deve implementare il metodo System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters . Questo metodo recupera i parametri dinamici dell'elemento sul percorso indicato e restituisce un oggetto che possiede proprietà e campi con attributi di analisi simili a una classe cmdlet o a un oggetto System.Management.Automation.RuntimeDefinedParameterDictionary . L'runtime di Windows PowerShell utilizza l'oggetto restituito per aggiungere i parametri al Clear-Item cmdlet.

Questo fornitore di articoli non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di questo metodo.

Eseguire un'azione predefinita per un oggetto

Un provider di oggetti PowerShell di Windows può implementare il metodo System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction per supportare le chiamate dal Invoke-Item cmdlet, consentendo così al provider di eseguire un'azione predefinita per l'elemento nel percorso specificato. Ad esempio, il fornitore del FileSystem potrebbe usare questo metodo per chiamare ShellExecute per un elemento specifico.

Questo fornitore non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di questo metodo.

Cose da ricordare sull'implementazione di InvokeDefaultAction

Le seguenti condizioni possono applicarsi a un'implementazione di System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Recupera i parametri dinamici per InvokeDefaultAction

A volte il Invoke-Item cmdlet richiede parametri aggiuntivi specificati dinamicamente a runtime. Per fornire questi parametri dinamici, il fornitore di elementi PowerShell di Windows deve implementare il metodo System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters . Questo metodo recupera i parametri dinamici dell'elemento sul percorso indicato e restituisce un oggetto che possiede proprietà e campi con attributi di analisi simili a una classe cmdlet o a un oggetto System.Management.Automation.RuntimeDefinedParameterDictionary . L'runtime PowerShell di Windows utilizza l'oggetto restituito per aggiungere i parametri dinamici al Invoke-Item cmdlet.

Questo fornitore di articoli non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di questo metodo.

Implementazione di metodi e classi helper

Questo fornitore di elementi implementa diversi metodi helper e classi utilizzati dai metodi pubblici di override definiti da Windows PowerShell. Il codice per questi metodi e classi helper è mostrato nella sezione Esempio di Codice .

Metodo NormalizePath

Questo fornitore di item implementa un metodo helper NormalizePath per garantire che il percorso abbia un formato coerente. Il formato specificato utilizza una barra inversa (\) come separatore.

Metodo PathIsDrive

Questo fornitore di oggetti implementa un metodo helper PathIsDrive per determinare se il percorso specificato è effettivamente il nome del disco.

Metodo ChunkPath

Questo fornitore di item implementa un metodo helper ChunkPath che suddivide il percorso specificato in modo che il provider possa identificare i suoi singoli elementi. Restituisce un array composto dagli elementi del cammino.

Metodo GetTable

Questo fornitore di elementi implementa il metodo helper GetTables che restituisce un oggetto DatabaseTableInfo che rappresenta le informazioni sulla tabella specificata nella chiamata.

Metodo GetRow

Il metodo System.Management.Automation.Provider.ItemCmdletProvider.GetItem di questo fornitore di item chiama il metodo helper GetRows . Questo metodo helper recupera un oggetto DatabaseRowInfo che rappresenta informazioni sulla riga specificata nella tabella.

Classe DatabaseTableInfo

Questo fornitore di elementi definisce una classe DatabaseTableInfo che rappresenta una raccolta di informazioni in una tabella dati del database. Questa classe è simile alla classe System.IO.Directoryinfo .

Il fornitore di elementi di esempio definisce un metodo DatabaseTableInfo.GetTables che restituisce una raccolta di oggetti informativi di tabella che definiscono le tabelle nel database. Questo metodo include un blocco try/catch per garantire che qualsiasi errore del database appaia come riga senza voci.

Classe DatabaseRowInfo

Questo fornitore di elementi definisce la classe helper DatabaseRowInfo che rappresenta una riga in una tabella del database. Questa classe è simile alla classe System.IO.FileInfo .

Il fornitore di esempio definisce un metodo DatabaseRowInfo.GetRows per restituire una collezione di oggetti informativi di riga per la tabella specificata. Questo metodo include un blocco tentativo/presa per intrappolare eccezioni. Qualsiasi errore comporterà l'assenza di informazioni sulle righe.

Esempio di codice

Per un codice di esempio completo, vedi AccessDbProviderSample03 Code Sample.

Definizione dei tipi di oggetti e formattazione

Quando si scrive un provider, può essere necessario aggiungere membri agli oggetti esistenti o definire nuovi oggetti. Al termine, crea un file Types che Windows PowerShell può utilizzare per identificare i membri dell'oggetto e un file Format che definisce come l'oggetto viene visualizzato. Per ulteriori informazioni, vedi Estendere i tipi di oggetto e la formattazione.

Costruire il provider PowerShell di Windows

Vedi come registrare cmdlet, fornitori e applicazioni host.

Test del provider PowerShell di Windows

Quando questo provider di elementi Windows PowerShell è registrato con Windows PowerShell, puoi testare solo la funzionalità base e il disco del provider. Per testare la manipolazione degli elementi, devi anche implementare la funzionalità dei container descritta in Implementing a Container Windows PowerShell Provider.

Vedere anche