Delen via


Een Windows PowerShell Navigatieprovider aanmaken

Dit onderwerp beschrijft hoe je een Windows PowerShell-navigatieprovider kunt maken die de datastore kan navigeren. Dit type provider ondersteunt recursieve commando's, geneste containers en relatieve paden.

Opmerking

Je kunt het C#-bronbestand (AccessDBSampleProvider05.cs) van deze provider downloaden met behulp van de Microsoft Windows Software Development Kit voor Windows Vista en .NET Framework 3.0 Runtime Components. Voor downloadinstructies, zie Hoe installeer je Windows PowerShell en download de Windows PowerShell SDK. De gedownloade bronbestanden zijn beschikbaar in de <PowerShell Samples-map> . Voor meer informatie over andere implementaties van Windows PowerShell-providers, zie Designing Your Windows PowerShell Provider.

De hier beschreven provider stelt de gebruiker in staat een Access-database als een schijf te beheren, zodat de gebruiker naar de datatabellen in de database kan navigeren. Bij het creëren van je eigen navigatieprovider kun je methoden implementeren waarmee schijfgekwalificeerde paden nodig zijn voor navigatie, relatieve paden worden genormaliseerd, items uit de datastore kunnen verplaatsen, evenals methoden die kindnamen ophalen, het ouderpad van een item krijgen en testen of een item een container is.

Waarschuwing

Wees je ervan bewust dat dit ontwerp uitgaat van een database met een veld met de naam-ID, en dat het type veld LongInteger is.

Definieer de Windows PowerShell-provider

Een Windows PowerShell-navigatieprovider moet een .NET-klasse aanmaken die is afgeleid van de System.Management.Automation.Provider.NavigationCmdletProvider-basisklasse . Hier is de klasse-definitie voor de navigatieprovider die in deze sectie wordt beschreven.

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

Let op dat in deze provider het attribuut System.Management.Automation.Provider.CmdletProviderAttribute twee parameters bevat. De eerste parameter specificeert een gebruiksvriendelijke naam voor de provider die door Windows PowerShell wordt gebruikt. De tweede parameter specificeert de Windows PowerShell-specifieke mogelijkheden die de provider tijdens de commandoverwerking aan de Windows PowerShell-runtime blootstelt. Voor deze provider zijn er geen Windows PowerShell-specifieke mogelijkheden toegevoegd.

Basisfunctionaliteit definiëren

Zoals beschreven in Design Your PS Provider, is de basisklasse System.Management.Automation.Provider.NavigationCmdletProvider afgeleid van verschillende andere klassen die verschillende providerfunctionaliteit boden. Een Windows PowerShell-navigatieprovider moet daarom alle functionaliteit definiëren die door die klassen wordt geleverd.

Om functionaliteit te implementeren voor het toevoegen van sessie-specifieke initialisatie-informatie en het vrijgeven van bronnen die door de provider worden gebruikt, zie Een Basic PS Provider aanmaken. De meeste providers (inclusief de hier beschreven provider) kunnen echter de standaardimplementatie van deze functionaliteit gebruiken die door Windows PowerShell wordt aangeboden.

Om toegang te krijgen tot de datastore via een Windows PowerShell-schijf, moet je de methoden van de System.Management.Automation.Provider.DriveCmdletProvider-basisklasse implementeren. Voor meer informatie over het implementeren van deze methoden, zie Het aanmaken van een Windows PowerShell Drive Provider.

Om de items van een datawinkel te manipuleren, zoals het ophalen, instellen en wissen van items, moet de provider de methoden implementeren die worden geleverd door de System.Management.Automation.Provider.ItemCmdletProvider-basisklasse . Voor meer informatie over het implementeren van deze methoden, zie Het aanmaken van een Windows PowerShell Item Provider.

Om bij de kinditems, of hun namen, van de datastore te komen, evenals bij methoden die items aanmaken, kopiëren, hernoemen en verwijderen, moet je de methoden implementeren die worden geleverd door de basisklasse System.Management.Automation.Provider.ContainerCmdletProvider . Voor meer informatie over het implementeren van deze methoden, zie Het aanmaken van een Windows PowerShell Container Provider.

Een Windows PowerShell-pad aanmaken

Windows PowerShell-navigatieproviders gebruiken een provider-intern Windows PowerShell-pad om de items van de datastore te navigeren. Om een provider-intern pad te creëren, moet de provider de methode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* implementeren om aanroepen van de Combine-Path cmdlet te ondersteunen. Deze methode combineert een ouder- en kindpad tot een provider-intern pad, waarbij een provider-specifieke padseparator tussen de ouder- en kindpaden wordt gebruikt.

De standaardimplementatie neemt paden met "/" of "\" als padscheider, normaliseert de padafscheider naar "\", combineert de ouder- en kindpaddelen met de scheider ertussen, en geeft vervolgens een string terug die de gecombineerde paden bevat.

Deze navigatieprovider implementeert deze methode niet. De volgende code is echter de standaardimplementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* -methode.

Dingen om te onthouden bij het implementeren van MakePath

De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:

  • Uw implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* -methode zou het pad niet moeten valideren als een juridisch volledig gekwalificeerd pad in de providernaamruimte. Wees je ervan bewust dat elke parameter slechts een deel van een pad kan representeren, en dat de gecombineerde delen mogelijk geen volledig gekwalificeerd pad genereren. Bijvoorbeeld, de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* -methode voor de FileSystem-provider kan "windows\system32" in de parent parameter en "abc.dll" in de child parameter ontvangen. De methode voegt deze waarden samen met de "\"-scheider en geeft "windows\system32\abc.dll" terug, wat geen volledig gekwalificeerd bestandssysteempad is.

    Belangrijk

    De paddelen die in de aanroep naar System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* worden aangeboden, kunnen tekens bevatten die niet zijn toegestaan in de providernaamruimte. Deze personages worden waarschijnlijk gebruikt voor wildcard-uitbreiding en de implementatie van deze methode zou ze niet moeten verwijderen.

Het Ouderpad ophalen

Windows PowerShell-navigatieproviders implementeren de methode System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* om het oudergedeelte van het aangegeven volledige of gedeeltelijke provider-specifieke pad op te halen. De methode verwijdert het kindgedeelte van het pad en geeft het ouderpadgedeelte terug. De root parameter specificeert het volledig gekwalificeerde pad naar de wortel van een schijf. Deze parameter kan nul of leeg zijn als een gemonteerde schijf niet wordt gebruikt voor de ophaaloperatie. Als een wortel wordt gespecificeerd, moet de methode een pad teruggeven naar een container in dezelfde boom als de wortel.

De voorbeeldnavigatieprovider overschrijft deze methode niet, maar gebruikt de standaardimplementatie. Het accepteert paden die zowel "/" als "\" als padseparators gebruiken. Eerst normaliseert het het pad zodat het alleen "\"-scheiders heeft, splitst dan het ouderpad af bij de laatste "\" en geeft het ouderpad terug.

Om te onthouden hoe je GetParentPath implementeert

Je implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* methode moet het pad lexicaal splitsen op de padseparator voor de providernaamruimte. Bijvoorbeeld, de FileSystem-provider gebruikt deze methode om de laatste "\" te zoeken en alles links van de scheidingsmeter terug te geven.

Haal de naam van het kindpad op

Je navigatieprovider implementeert de methode System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* om de naam (bladelement) van het kind van het item op te halen dat zich bevindt op het aangegeven volledige of gedeeltelijke, provider-specifieke pad.

De voorbeeldnavigatieprovider overschrijft deze methode niet. De standaardimplementatie wordt hieronder getoond. Het accepteert paden die zowel "/" als "\" als padseparators gebruiken. Eerst wordt het pad genormaliseerd zodat het alleen "\"-scheiders heeft, daarna splitst het ouderpad af bij de laatste "\" en geeft de naam van het kindpadgedeelte terug.

Dingen om te onthouden bij het implementeren van GetChildName

Je implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* methode moet het pad lexicaal splitsen op de padscheider. Als het aangeleverde pad geen padscheiders bevat, moet de methode het pad ongewijzigd teruggeven.

Belangrijk

Het pad dat in de aanroep naar deze methode wordt gegeven, kan tekens bevatten die illegaal zijn in de providernaamruimte. Deze tekens worden waarschijnlijk gebruikt voor wildcard-uitbreiding of reguliere expressiematching, en de implementatie van deze methode zou ze niet moeten verwijderen.

Bepalen of een Item een Container is

De navigatieprovider kan de methode System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* implementeren om te bepalen of het opgegeven pad een container aangeeft. Het geeft waar terug als het pad een container vertegenwoordigt, en anders vals. De gebruiker heeft deze methode nodig om de Test-Path cmdlet te kunnen gebruiken voor het geleverde pad.

De volgende code toont de System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer*- implementatie in onze voorbeeldnavigatieprovider. De methode verifieert dat het opgegeven pad correct is en of de tabel bestaat, en geeft true terug als het pad een container aangeeft.

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

Dingen om te onthouden bij het implementeren van IsItemContainer

Je navigatieprovider .NET-klasse kan providercapaciteiten ExpandWildcards, Filter, Include, of Exclude aangeven uit de System.Management.Automation.Provider.ProviderCapabilities-enumeratie . In dit geval moet de implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* ervoor zorgen dat het doorgegeven pad aan de eisen voldoet. Om dit te doen, moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschap System.Management.Automation.Provider.CmdletProvider.Exclusivlude* .

Een voorwerp verplaatsen

Ter ondersteuning van de Move-Item cmdlet implementeert uw navigatieprovider de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* -methode. Deze methode verplaatst het item dat door de path parameter is gespecificeerd naar de container op het pad dat in de destination parameter wordt opgegeven.

De voorbeeldnavigatieprovider overschrijft de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* -methode niet. Het volgende is de standaardimplementatie.

Dingen om te onthouden bij het implementeren van MoveItem

Je navigatieprovider .NET-klasse kan providercapaciteiten ExpandWildcards, Filter, Include, of Exclude aangeven uit de System.Management.Automation.Provider.ProviderCapabilities-enumeratie . In dit geval moet de implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* ervoor zorgen dat het doorgegeven pad aan de eisen voldoet. Om dit te doen, moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschap CmdletProvider.Exlyude .

Standaard zouden overrides van deze methode geen objecten over bestaande objecten moeten verplaatsen, tenzij de eigenschap System.Management.Automation.Provider.CmdletProvider.Force* is ingesteld op true. De FileSystem-provider kopieert bijvoorbeeld C:\temp\abc.txt niet over een bestaand C:\bar.txt-bestand tenzij de eigenschap System.Management.Automation.Provider.CmdletProvider.Force* is ingesteld op true. Als het pad dat in de destination parameter is gespecificeerd bestaat en een container is, is de eigenschap System.Management.Automation.Provider.CmdletProvider.Force* niet vereist. In dit geval moet System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* het item dat door de path parameter wordt aangeduid naar de container verplaatsen destination als kind.

Je implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* methode moet System.Management.Automation.Provider.CmdletProvider.ShouldProcess aanroepen en de retourwaarde controleren voordat je wijzigingen aanbrengt in de datastore. Deze methode wordt gebruikt om de uitvoering van een operatie te bevestigen wanneer er een wijziging in de systeemstatus wordt aangebracht, bijvoorbeeld het verwijderen van bestanden. System.Management.Automation.Provider.CmdletProvider.ShouldProcess stuurt de naam van de te wijzigen resource naar de gebruiker, waarbij de Windows PowerShell-runtime rekening houdt met eventuele commandoregelinstellingen of voorkeursvariabelen bij het bepalen wat aan de gebruiker getoond moet worden.

Nadat de aanroep van System.Management.Automation.Provider.CmdletProvider.ShouldProcess terugkeert true, moet de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* methode de methode System.Management.Automation.Provider.CmdletProvider.ShouldContinue aanroepen. Deze methode stuurt een bericht naar de gebruiker om feedback te geven of de bewerking moet worden voortgezet. Uw provider moet System.Management.Automation.Provider.CmdletProvider.ShouldContinue bellen als extra controle op mogelijk gevaarlijke systeemaanpassingen.

Dynamische parameters toevoegen aan de Move-Item cmdlet

Soms vereist de Move-Item cmdlet extra parameters die dynamisch tijdens runtime worden geleverd. Om deze dynamische parameters te bieden, moet de navigatieprovider de methode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* implementeren om de vereiste parameterwaarden van het item op het aangegeven pad te krijgen, en een object teruggeven met eigenschappen en velden met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object .

Deze navigatieprovider implementeert deze methode niet. De volgende code is echter de standaardimplementatie van System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normaliseren van een relatief pad

Je navigatieprovider implementeert de methode System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* om het volledig gekwalificeerde pad dat in de path parameter is aangegeven als relatief aan het door de basePath parameter gespecificeerde pad te normaliseren. De methode geeft een stringrepresentatie van het genormaliseerde pad terug. Het schrijft een fout als de path parameter een niet-bestaand pad specificeert.

De voorbeeldnavigatieprovider overschrijft deze methode niet. Het volgende is de standaardimplementatie.

Dingen om te onthouden bij het implementeren van NormalizeRelativePath

Je implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* zou de path parameter moeten parsen, maar hoeft niet uitsluitend syntactische parsing te gebruiken. Je wordt aangemoedigd deze methode te ontwerpen om het pad te gebruiken om de padinformatie in de datastore op te zoeken en een pad te creëren dat overeenkomt met de casing en de gestandaardiseerde padsyntaxis.

Codevoorbeeld

Voor volledige voorbeeldcode, zie AccessDbProviderSample05 Code Voorbeeld.

Objecttypes en opmaak definiëren

Het is mogelijk voor een provider om leden toe te voegen aan bestaande objecten of nieuwe objecten te definiëren. Voor meer informatie, zieUitbreiden van Objecttypes en Opmaak.

Het bouwen van de Windows PowerShell-provider

Voor meer informatie, zie Hoe registreer je cmdlets, providers en hostapplicaties.

De Windows PowerShell-provider testen

Wanneer je Windows PowerShell-provider geregistreerd is bij Windows PowerShell, kun je dit testen door de ondersteunde cmdlets op de commandoregel uit te voeren, inclusief cmdlets die beschikbaar zijn gemaakt door derivatie. Dit voorbeeld test de voorbeeldnavigatieprovider.

  1. Voer je nieuwe shell uit en gebruik de Set-Location cmdlet om het pad in te stellen dat het de Access-database aangeeft.

    Set-Location mydb:
    
  2. Voer nu de Get-ChildItem cmdlet uit om een lijst van database-items op te halen, wat de beschikbare databasetabellen zijn. Voor elke tabel haalt deze cmdlet ook het aantal tabelrijen op.

    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. Gebruik de Set-Location cmdlet opnieuw om de locatie van de Medewerkers-datatabel in te stellen.

    Set-Location Employees
    
  4. Laten we nu de Get-Location cmdlet gebruiken om het pad naar de Employees-tabel op te halen.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Gebruik nu de Get-ChildItem cmdlet die naar de Format-Table cmdlet is geleid. Deze set cmdlets haalt de items op voor de Employees-datatabel, dat zijn de tabelrijen. Ze zijn geformatteerd zoals gespecificeerd door de 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. Je kunt nu de Get-Item cmdlet uitvoeren om de items voor rij 0 van de Employees datatabel op te halen.

    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. Gebruik de Get-Item cmdlet opnieuw om de medewerkersgegevens van de items in rij 0 op te halen.

    (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
    

Zie ook

Het aanmaken van Windows PowerShell-providers

Design Your Windows PowerShell provider

Uitbreiden van objecttypes en opmaak

Implementeer een Container Windows PowerShell-provider

Hoe registreer je cmdlets, providers en hostapplicaties

Windows PowerShell Programmeursgids

Windows PowerShell SDK