Condividi tramite


Creazione di un provider di navigazione PowerShell per Windows

Questo argomento descrive come creare un provider di navigazione Windows PowerShell che possa navigare nel data store. Questo tipo di provider supporta comandi ricorsive, container annidati e percorsi relativi.

Annotazioni

Puoi scaricare il file sorgente C# (AccessDBSampleProvider05.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 <directory PowerShell Samples> . Per maggiori informazioni su altre implementazioni di provider PowerShell di Windows, vedi Progettare il tuo provider PowerShell Windows.

Il provider descritto qui consente all'utente di gestire un database Access come un'unità, così da poter navigare alle tabelle dati del database. Quando crei il tuo provider di navigazione, puoi implementare metodi che permettano di creare percorsi qualificati per la navigazione necessari per la navigazione, normalizzare i percorsi relativi, spostare elementi dello store dati, così come metodi che ottengono nomi figli, ottengono il percorso genitore di un elemento e testano per identificare se un elemento è un container.

Attenzione

Tieni presente che questo design presuppone un database che ha un campo con il nome ID, e che il tipo del campo sia LongInteger.

Definisci il provider PowerShell di Windows

Un provider di navigazione Windows PowerShell deve creare una classe .NET che derivi dalla classe base System.Management.Automation.Provider.NavigationCmdletProvider . Ecco la definizione di classe per il fornitore di navigazione descritto in questa sezione.

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

Si noti che in questo provider, 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 sono state aggiunte funzionalità specifiche di Windows PowerShell.

Definizione della funzionalità di base

Come descritto in Design Your PS Provider, la classe base System.Management.Automation.Provider.NavigationCmdletProvider deriva da diverse altre classi che fornivano funzionalità diverse per i fornitori. Un fornitore di navigazione Windows PowerShell, quindi, deve definire tutte le funzionalità fornite da queste classi.

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

Per accedere allo store dati tramite un drive PowerShell di Windows, è necessario implementare i metodi della classe base System.Management.Automation.Provider.DriveCmdletProvider . Per maggiori informazioni sull'implementazione di questi metodi, vedi Creare un provider di unità PowerShell per Windows.

Per manipolare gli elementi di un archivio dati, come ottenere, impostare e cancellare gli elementi, il provider deve implementare i metodi forniti dalla classe base System.Management.Automation.Provider.ItemCmdletProvider . Per maggiori informazioni sull'implementazione di questi metodi, vedi Creare un fornitore di oggetti PowerShell per Windows.

Per accedere agli elementi figli, o ai loro nomi, dello store dati, così come ai metodi che creano, copiano, rinominano e rimuovono elementi, devi implementare i metodi forniti dalla classe base System.Management.Automation.Provider.ContainerCmdletProvider . Per maggiori informazioni sull'implementazione di questi metodi, vedi Creare un provider di container Windows PowerShell.

Creazione di un percorso PowerShell per Windows

Il provider di navigazione Windows PowerShell utilizza un percorso PowerShell interno al provider per navigare tra gli elementi dello store dati. Per creare un percorso interno al fornitore, il provider deve implementare il metodo System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* per supportare le chiamate dal cmdlet Combine-Path. Questo metodo combina un percorso genitore e un percorso figlio in un percorso interno-fornitore, utilizzando un separatore di percorso specifico per il provider tra i percorsi genitore e figlio.

L'implementazione predefinita prende i percorsi con "/" o "\" come separatore di cammino, normalizza il separatore di percorso in "\", combina le parti di cammino genitore e figlio con il separatore tra di esse, e poi restituisce una stringa che contiene i percorsi combinati.

Questo fornitore di navigazione non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita del metodo System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* .

Cose da ricordare sull'implementazione di MakePath

Le seguenti condizioni possono applicarsi alla tua implementazione di System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:

Recupero del Percorso Genitore

I provider di navigazione PowerShell di Windows implementano il metodo System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* per recuperare la parte genitore del percorso specifico fornitore completo o parziale indicato. Il metodo rimuove la parte figlia del percorso e restituisce la parte del percorso genitore. Il parametro root specifica il percorso completamente qualificato verso la radice di un disco. Questo parametro può essere nullo o vuoto se non è in uso un disco montato per l'operazione di recupero. Se viene specificata una radice, il metodo deve restituire un percorso a un contenitore nello stesso albero della radice.

Il provider di navigazione campione non sovrascrive questo metodo, ma utilizza l'implementazione predefinita. Accetta percorsi che usano sia "/" che "\" come separatori di cammino. Prima normalizza il percorso per avere solo separatori "\", poi separa il percorso genitore all'ultimo "\" e restituisce il percorso genitore.

Ricordare dell'implementazione di GetParentPath

La tua implementazione del metodo System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* dovrebbe suddividere il percorso lessicamente sul separatore di percorso per il namespace provider. Ad esempio, il provider del FileSystem usa questo metodo per cercare l'ultimo "\" e restituisce tutto ciò che si trova a sinistra del separatore.

Recupera il nome del percorso figlio

Il tuo provider di navigazione implementa il metodo System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* per recuperare il nome (elemento foglia) del figlio dell'elemento situato sul percorso specifico del fornitore completo o parziale.

Il fornitore di navigazione campione non sovrascrive questo metodo. L'implementazione predefinita è mostrata di seguito. Accetta percorsi che usano sia "/" che "\" come separatori di cammino. Prima normalizza il percorso per avere solo separatori "\", poi separa il percorso genitore all'ultimo "\" e restituisce il nome della parte del percorso figlio.

Cose da ricordare sull'implementazione di GetChildName

La tua implementazione del metodo System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* dovrebbe suddividere il percorso lessicamente sul separatore di cammino. Se il percorso fornito non contiene separatori di cammino, il metodo dovrebbe restituire il percorso senza modifica.

Importante

Il percorso fornito nella chiamata a questo metodo potrebbe contenere caratteri illegali nello spazio dei fornitori. Questi caratteri sono molto probabilmente usati per l'espansione delle wildcard o per l'abbinamento di espressioni regolari, e l'implementazione di questo metodo non dovrebbe rimuoverli.

Determinare se un oggetto è un contenitore

Il provider di navigazione può implementare il metodo System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* per determinare se il percorso specificato indica un container. Restituisce true se il percorso rappresenta un contenitore, e false altrimenti. L'utente ha bisogno di questo metodo per poter utilizzare il Test-Path cmdlet per il percorso fornito.

Il seguente codice mostra l'implementazione System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* nel nostro provider di navigazione di esempio. Il metodo verifica che il percorso specificato sia corretto e se la tabella esiste, e restituisce true se il percorso indica un contenitore.

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

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

   return false;
} // IsItemContainer

Cose da ricordare sull'implementazione di IsItemContainer

La tua classe .NET provider di navigazione potrebbe dichiarare le capacità provider di ExpandWildcards, Filtrare, Includere o Escludere dall'enumerazione System.Management.Automation.Provider.ProviderCapabilities . In questo caso, l'implementazione di System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* deve garantire che il percorso superato soddisfi i requisiti. Per farlo, il metodo dovrebbe accedere alla proprietà appropriata, ad esempio la proprietà System.Management.Automation.Provider.CmdletProvider.Exclude* .

Spostare un oggetto

A supporto del Move-Item cmdlet, il tuo provider di navigazione implementa il metodo System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Questo metodo sposta l'elemento specificato dal path parametro al contenitore sul percorso fornito nel destination parametro.

Il provider di navigazione di esempio non sovrascrive il metodo System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Di seguito è riportata l'implementazione predefinita.

Cose da ricordare sull'implementazione di MoveItem

La tua classe .NET provider di navigazione potrebbe dichiarare le capacità provider di ExpandWildcards, Filtrare, Includere o Escludere dall'enumerazione System.Management.Automation.Provider.ProviderCapabilities . In questo caso, l'implementazione di System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* deve garantire che il percorso passato soddisfi i requisiti. Per farlo, il metodo dovrebbe accedere alla proprietà appropriata, ad esempio il CmdletProvider.Esclude la proprietà.

Di default, gli override di questo metodo non dovrebbero spostare oggetti su oggetti esistenti a meno che la proprietà System.Management.Automation.Provider.CmdletProvider.Force* non sia impostata su true. Ad esempio, il provider del FileSystem non copierà C:\temp\abc.txt su un file C:\bar.txt esistente a meno che la proprietà System.Management.Automation.Provider.CmdletProvider.Force* non sia impostata su true. Se il percorso specificato nel destination parametro esiste ed è un container, la proprietà System.Management.Automation.Provider.CmdletProvider.Force* non è necessaria. In questo caso, System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* dovrebbe spostare l'elemento indicato dal path parametro al contenitore indicato dal destination parametro come figlio.

La tua implementazione del metodo System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* dovrebbe chiamare System.Management.Automation.Provider.CmdletProvider.ShouldProcess e verificare il valore di ritorno prima di apportare qualsiasi modifica allo store dati. Questo metodo viene utilizzato per confermare l'esecuzione di un'operazione quando viene effettuata una modifica allo stato di sistema, ad esempio eliminando file. System.Management.Automation.Provider.CmdletProvider.ShouldProcess invia il nome della risorsa da modificare all'utente, con l'runtime di Windows PowerShell che tiene conto di eventuali impostazioni da riga di comando o variabili preferenziali nel determinare cosa deve essere visualizzato all'utente.

Dopo la chiamata a System.Management.Automation.Provider.CmdletProvider.ShouldProcess , trueil metodo System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* dovrebbe chiamare il metodo System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Questo metodo invia un messaggio all'utente per consentire un feedback che indichi se l'operazione deve essere continuata. Il tuo fornitore dovrebbe chiamare System.Management.Automation.Provider.CmdletProvider.ShouldContinue come ulteriore controllo per eventuali modifiche di sistema potenzialmente pericolose.

Attacco dei parametri dinamici al Move-Item cmdlet

A volte il Move-Item cmdlet richiede parametri aggiuntivi che vengono forniti dinamicamente a runtime. Per fornire questi parametri dinamici, il provider di navigazione deve implementare il metodo System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* per ottenere i valori dei parametri richiesti dall'elemento nel percorso indicato, e restituire un oggetto con proprietà e campi con attributi di analisi simili a una classe cmdlet o a un oggetto System.Management.Automation.RuntimeDefinedParameterDictionary .

Questo fornitore di navigazione non implementa questo metodo. Tuttavia, il seguente codice è l'implementazione predefinita di System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normalizzazione di un percorso relativo

Il tuo provider di navigazione implementa il metodo System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* per normalizzare il percorso completamente qualificato indicato nel path parametro come relativo al percorso specificato dal basePath parametro. Il metodo restituisce una rappresentazione di stringhe del percorso normalizzato. Scrive un errore se il path parametro specifica un percorso inesistente.

Il fornitore di navigazione campione non sovrascrive questo metodo. Di seguito è riportata l'implementazione predefinita.

Cose da ricordare sull'implementazione di NormalizeRelativePath

La tua implementazione di System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* dovrebbe analizzare il path parametro, ma non deve necessariamente usare l'analisi parsing puramente sintattica. Ti viene consigliato progettare questo metodo per usare il percorso per cercare le informazioni del percorso nel data store e creare un percorso che corrisponda alla casing e alla sintassi del percorso standardizzato.

Codice di esempio

Per il codice di esempio completo, vedi AccessDbProviderSample05 Code Sample.

Definizione dei tipi di oggetti e formattazione

È possibile per un provider aggiungere membri a oggetti esistenti o definire nuovi oggetti. Per ulteriori informazioni,vedi Estendere i tipi di oggetto e la formattazione.

Costruire il provider PowerShell di Windows

Per ulteriori informazioni, vedi Come registrare Cmdlet, Provider e Applicazioni Host.

Test del provider PowerShell di Windows

Quando il tuo provider PowerShell di Windows è stato registrato con Windows PowerShell, puoi testarlo eseguendo i cmdlet supportati sulla riga di comando, inclusi i cmdlet resi disponibili tramite derivazione. Questo esempio testerà il fornitore di navigazione campione.

  1. Esegui la tua nuova shell e usa il Set-Location cmdlet per impostare il percorso che indichi il database Access.

    Set-Location mydb:
    
  2. Ora esegui il Get-ChildItem cmdlet per recuperare una lista degli elementi del database, che sono le tabelle disponibili. Per ogni tabella, questo cmdlet recupera anche il numero di righe della tabella.

    Get-ChildItem | Format-Table RowCount, Name -AutoSize
    
    RowCount   Name
    --------   ----
         180   MSysAccessObjects
           0   MSysACEs
           1   MSysCmdbars
           0   MSysIMEXColumns
           0   MSysIMEXSpecs
           0   MSysObjects
           0   MSysQueries
           7   MSysRelationships
           8   Categories
          91   Customers
           9   Employees
        2155   Order Details
         830   Orders
          77   Products
           3   Shippers
          29   Suppliers
    
  3. Usa di nuovo il Set-Location cmdlet per impostare la posizione della tabella dati dei dipendenti.

    Set-Location Employees
    
  4. Ora usiamo il Get-Location cmdlet per recuperare il percorso verso la tabella dei dipendenti.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Ora usa il Get-ChildItem cmdlet canalizzato al Format-Table cmdlet. Questo insieme di cmdlet recupera gli elementi per la tabella dati dei Dipendenti, che sono le righe della tabella. Sono formattati come specificato dal Format-Table cmdlet.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   PSIsContainer   Data
    ---------   --------------   ----
    0           False            System.Data.DataRow
    1           False            System.Data.DataRow
    2           False            System.Data.DataRow
    3           False            System.Data.DataRow
    4           False            System.Data.DataRow
    5           False            System.Data.DataRow
    6           False            System.Data.DataRow
    7           False            System.Data.DataRow
    8           False            System.Data.DataRow
    
  6. Ora puoi eseguire il Get-Item cmdlet per recuperare gli elementi della riga 0 della tabella dati dei dipendenti.

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\Employees\0
    PSParentPath  : AccessDB::C:\PS\Northwind.mdb\Employees
    PSChildName   : 0
    PSDrive       : mydb
    PSProvider    : System.Management.Automation.ProviderInfo
    PSIsContainer : False
    Data           : System.Data.DataRow
    RowNumber      : 0
    
  7. Usa di nuovo il Get-Item cmdlet per recuperare i dati del dipendente per gli elementi nella riga 0.

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

Vedere anche

Creazione di provider PowerShell per Windows

Progetta il tuo provider PowerShell per Windows

Estensione dei tipi di oggetti e della formattazione

Implementa un provider PowerShell per Windows Container

Come registrare cmdlet, fornitori e applicazioni host

Guida per programmatori PowerShell di Windows

Windows PowerShell SDK