Een Windows PowerShell-navigatieprovider maken

In dit onderwerp wordt beschreven hoe u een Windows PowerShell-provider maakt die door het gegevensopslag kan navigeren. Dit type provider ondersteunt recursieve opdrachten, geneste containers en relatieve paden.

Notitie

U kunt het C#-bronbestand (AccessDBSampleProvider05.cs) voor deze provider downloaden met behulp van de Microsoft Windows Software Development Kit voor Windows Vista en .NET Framework 3.0 Runtime Components. Zie How to Install Windows PowerShell and Download the Windows PowerShell SDK voor downloadinstructies. De gedownloade bronbestanden zijn beschikbaar in de <PowerShell Samples> map . Zie Designing Your Windows PowerShell Provider (Uw Windows PowerShell provider ontwerpen) voor meer informatie over andere implementaties van Windows PowerShell-provider.

Met de provider die hier wordt beschreven, kan de gebruiker een Access-database als een station verwerken, zodat de gebruiker naar de gegevenstabellen in de database kan navigeren. Wanneer u uw eigen navigatieprovider maakt, kunt u methoden implementeren die door het station gekwalificeerde paden kunnen maken die vereist zijn voor navigatie, relatieve paden normaliseren, items van het gegevensopslag verplaatsen, evenals methoden die onderliggende namen krijgen, het bovenliggende pad van een item op halen en testen om te bepalen of een item een container is.

Waarschuwing

In dit ontwerp wordt ervan uitgenomen dat er een database is met een veld met de naam-id en dat het type van het veld LongInteger is.

De provider Windows PowerShell definiëren

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

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

Houd er rekening mee dat bij deze provider het kenmerk System.Management.Automation.Provider.Cmdletproviderattribute twee parameters bevat. Met de eerste parameter geeft u een gebruiksvriendelijke naam op voor de provider die wordt gebruikt door Windows PowerShell. Met de tweede parameter geeft u de Windows PowerShell mogelijkheden op die de provider tijdens de verwerking van de opdracht Windows PowerShell aan de Windows PowerShell geeft. Voor deze provider zijn er geen Windows PowerShell mogelijkheden die worden toegevoegd.

Basisfunctionaliteit definiëren

Zoals beschreven in Uw PS-providerontwerpen, is de basisklasse System.Management.Automation.Provider.Navigationcmdletprovider afgeleid van verschillende andere klassen die verschillende providerfunctionaliteit bieden. Een Windows PowerShell navigatieprovider moet daarom alle functionaliteit van deze klassen definiëren.

Zie Creating a Basic PS Provider (Een ps-basisprovider maken) voor het implementeren van functionaliteit voor het toevoegen van sessiespecifieke initialisatiegegevensen voor het vrijgeven van resources die worden gebruikt door de provider. De meeste providers (inclusief de provider die hier wordt beschreven) kunnen echter gebruikmaken van de standaard implementatie van deze functionaliteit die door Windows PowerShell.

Als u toegang wilt krijgen tot het gegevensopslag via een Windows PowerShell station, moet u de methoden van de basisklasse System.Management.Automation.Provider.Drivecmdletprovider implementeren. Zie creating a Windows PowerShell Drive Provider (Een Windows PowerShell-stationprovider) voor meer informatie over hetimplementeren van deze methoden.

Als u de items van een gegevensopslag wilt bewerken, zoals het verkrijgen, instellen en wissen van items, moet de provider de methoden implementeren die worden geleverd door de basisklasse System.Management.Automation.Provider.Itemcmdletprovider. Zie Creating an Windows PowerShell Item Provider (Eenprovider voor Windows PowerShell maken) voor meer informatie over het implementeren van deze methoden.

Als u de onderliggende items of hun namen van het gegevensopslag wilt openen, evenals methoden voor het maken, kopiëren, hernoemen en verwijderen van items, moet u de methoden implementeren die worden geleverd door de basisklasse System.Management.Automation.Provider.Containercmdletprovider. Zie Creating a Windows PowerShell Container Provider (Een containerprovider Windows PowerShell maken) voor meer informatie over hetimplementeren van deze methoden.

Een Windows PowerShell maken

Windows PowerShell navigatieprovider gebruikt een intern provider-Windows PowerShell pad om door de items van het gegevensopslag te navigeren. Als u een provider intern pad wilt maken, moet de provider de methode System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* implementeren om aanroepen van de cmdlet Combine-Path ondersteunen. Deze methode combineert een bovenliggend en onderliggend pad in een provider-intern pad, met behulp van een providerspecifieke padscheidingsteken tussen de bovenliggende en onderliggende paden.

De standaard implementatie maakt gebruik van paden met '/' of '' als het padscheidingsteken, normaliseert het padscheidingsteken naar " , combineert de bovenliggende en onderliggende padonderdelen met het scheidingsteken ertussen en retourneert vervolgens een tekenreeks die de gecombineerde paden \ \ bevat.

Deze navigatieprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van de methode System.Management.Automation.Provider.Navigationcmdletprovider.Makepath*.

Dingen om te onthouden over 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 methode System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* mag het pad niet valideren als een juridisch volledig gekwalificeerd pad in de providernaamruimte. Let erop dat elke parameter slechts een deel van een pad kan vertegenwoordigen en dat de gecombineerde onderdelen mogelijk geen volledig gekwalificeerd pad genereren. De methode System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* voor de bestandssysteemprovider kan bijvoorbeeld 'windows\system32' ontvangen in de parameter en parent 'abc.dll' in de child parameter . De methode voegt deze waarden samen met het scheidingsteken " en retourneert "windows\system32\abc.dll", wat geen volledig \ gekwalificeerd bestandssysteempad is.

    Belangrijk

    De padonderdelen in de aanroep van System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* bevatten mogelijk tekens die niet zijn toegestaan in de providernaamruimte. Deze tekens worden waarschijnlijk gebruikt voor uitbreiding van jokertekens en de implementatie van deze methode mag ze niet verwijderen.

Het bovenliggende pad ophalen

Windows PowerShell navigatieproviders implementeren de methode System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* om het bovenliggende deel van het aangegeven volledige of gedeeltelijke providerspecifieke pad op te halen. De methode verwijdert het onderliggende deel van het pad en retourneert het bovenliggende padgedeelte. De root parameter geeft het volledig gekwalificeerde pad naar de hoofdmap van een station. Deze parameter kan null of leeg zijn als een bevestigd station niet wordt gebruikt voor de ophaalbewerking. Als er een hoofdmap is opgegeven, moet de methode een pad retourneren naar een container in dezelfde structuur als de hoofdmap.

De voorbeeldnavigatieprovider overschrijven deze methode niet, maar gebruikt de standaard implementatie. Paden die zowel '/' als \ '' als padscheidingstekens gebruiken, worden geaccepteerd. Het pad wordt eerst genormaliseerd met alleen scheidingstekens " " , waarna het bovenliggende pad bij de laatste " wordt gesplitst en het bovenliggende pad \ \ wordt retourneert.

Om te onthouden over het implementeren van GetParentPath

Uw implementatie van de methode System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* moet het pad lexicaal splitsen op het padscheidingsteken voor de providernaamruimte. De bestandssysteemprovider gebruikt deze methode bijvoorbeeld om te zoeken naar de laatste ' en retourneert alles links van \ het scheidingsteken.

De naam van het onderliggende pad ophalen

Uw navigatieprovider implementeert de methode System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname*om de naam (leaf-element) op te halen van het onderliggende item dat zich op het aangegeven volledige of gedeeltelijke providerspecifieke pad bevindt.

De voorbeeldnavigatieprovider overschrijven deze methode niet. De standaard implementatie wordt hieronder weergegeven. Paden die zowel '/' als \ '' als padscheidingstekens gebruiken, worden geaccepteerd. Het pad wordt eerst genormaliseerd met alleen scheidingstekens " " , waarna het bovenliggende pad bij het laatste " wordt gesplitst en de naam van het onderliggende padgedeelte \ \ wordt retourneert.

Dingen om te onthouden over het implementeren van GetChildName

Uw implementatie van de methode System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname* moet het pad lexicaal op het padscheidingsteken splitsen. Als het opgegeven pad geen padscheidingstekens bevat, moet de methode het pad ongewijzigd retourneren.

Belangrijk

Het pad dat is opgegeven in de aanroep van deze methode kan tekens bevatten die niet in de naamruimte van de provider zijn opgeslagen. Deze tekens worden waarschijnlijk gebruikt voor uitbreiding van jokertekens of reguliere expressies die overeenkomen, en de implementatie van deze methode mag ze niet 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 retourneert true als het pad een container vertegenwoordigt en anders onwaar. De gebruiker heeft deze methode nodig om de Test-Path cmdlet voor het opgegeven pad te kunnen gebruiken.

De volgende code toont de implementatie System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* in onze voorbeeldnavigatieprovider. De methode controleert of het opgegeven pad juist is en of de tabel bestaat en retourneert true 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 over het implementeren van IsItemContainer

De .NET-klasse van uw navigatieprovider kan providermogelijkheden van ExpandWildcards, Filter, Include of Exclude declareer uit de system.Management.Automation.Provider.Providercaperation. In dit geval moet de implementatie van System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* ervoor zorgen dat het doorgegeven pad voldoet aan de vereisten. Hiervoor moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschap System.Management.Automation.Provider.Cmdletprovider.Exclude*.

Een item verplaatsen

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

De voorbeeldnavigatieprovider overschrijven niet de methode System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem*. Hier volgt de standaard implementatie.

Dingen om te onthouden over het implementeren van MoveItem

De .NET-klasse van uw navigatieprovider kan providermogelijkheden van ExpandWildcards, Filter, Include of Exclude declareer uit de system.Management.Automation.Provider.Providercaperation. In dit geval moet de implementatie van System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* ervoor zorgen dat het doorgegeven pad voldoet aan de vereisten. Hiervoor moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschap CmdletProvider.Exclude.

Standaard mogen met overschrijvingen van deze methode geen objecten worden verplaatst over bestaande objecten, tenzij de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* is ingesteld op true . De bestandssysteemprovider kopieert c:\temp\abc.txt bijvoorbeeld niet via een bestaand c:\bar.txt-bestand, tenzij de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* is ingesteld op true . Als het pad dat is opgegeven in de parameter bestaat en een container is, is de eigenschap destination System.Management.Automation.Provider.Cmdletprovider.Force* niet vereist. In dit geval moet System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* het item dat wordt aangegeven door de parameter verplaatsen naar de container die wordt aangegeven door de parameter als path een onderliggend destination item.

Uw implementatie van de methode System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* moet System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aanroepen en de retourwaarde controleren voordat u wijzigingen aan het gegevensopslag aanlevert. Deze methode wordt gebruikt om de uitvoering van een bewerking te bevestigen wanneer een wijziging wordt aangebracht in de systeemtoestand, bijvoorbeeld het verwijderen van bestanden. System.Management.Automation.Provider.Cmdletprovider.ShouldProcess verzendt de naam van de resource die aan de gebruiker moet worden gewijzigd, waarbij de Windows PowerShell-runtime rekening houdt met opdrachtregelinstellingen of voorkeursvariabelen om te bepalen wat aan de gebruiker moet worden weergegeven.

Na de aanroep van System.Management.Automation.Provider.Cmdletprovider.ShouldProcess retourneert, moet de methode true System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* de methode System.Management.Automation.Provider.Cmdletprovider.ShouldContinue aanroepen. Met deze methode wordt een bericht naar de gebruiker gestuurd om feedback te geven als de bewerking moet worden voortgezet. Uw provider moet System.Management.Automation.Provider.Cmdletprovider.ShouldContinue aanroepen als een extra controle op mogelijk gevaarlijke systeemwijzigingen.

Dynamische parameters koppelen aan de Move-Item cmdlet

Soms zijn Move-Item voor de cmdlet aanvullende parameters vereist die dynamisch worden opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet de navigatieprovider de methode System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters* implementeren om de vereiste parameterwaarden op te halen uit het item op het aangegeven pad en een object retourneren dat eigenschappen en velden bevat met parseerkenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object.

Deze navigatieprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters*.

Een relatief pad normaliseren

Uw navigatieprovider implementeert de methode System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* om het volledig gekwalificeerde pad te normaliseren dat in de parameter wordt aangegeven als relatief ten opzichte van het pad dat is opgegeven door de path basePath parameter. De methode retourneert een tekenreeksweergave van het genormaliseerde pad. Er wordt een fout wegschreven als path de parameter een niet-bestaand pad opgeeft.

De voorbeeldnavigatieprovider overschrijven deze methode niet. Hier volgt de standaard implementatie.

Dingen om te onthouden over het implementeren van NormalizeRelativePath

De implementatie van System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* moet de parameter parseren, maar hoeft geen path uitsluitend syntactische parsering te gebruiken. U wordt aangeraden deze methode zo te ontwerpen dat het pad wordt gebruikt om de padgegevens in het gegevensopslag op te zoeken en een pad te maken dat overeenkomt met de casing- en gestandaardiseerde padsyntaxis.

Codevoorbeeld

Zie AccessDbProviderSample05 Code Samplevoor de volledige voorbeeldcode.

Objecttypen en -opmaak definiëren

Het is mogelijk dat een provider leden toevoegt aan bestaande objecten of nieuwe objecten definieert. Zie ExtendingObject Types and Formatting (Objecttypen uitbreiden en formatteren) voor meer informatie.

De provider Windows PowerShell bouwen

Zie Cmdlets,providers en hosttoepassingen registreren voor meer informatie.

De Windows PowerShell-provider testen

Wanneer uw Windows PowerShell-provider is geregistreerd bij Windows PowerShell, kunt u deze testen door de ondersteunde cmdlets uit te voeren op de opdrachtregel, inclusief cmdlets die beschikbaar zijn gesteld door afleiding. In dit voorbeeld wordt de voorbeeldnavigatieprovider getest.

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

    Set-Location mydb:
    
  2. Voer nu de Get-Childitem cmdlet uit om een lijst met de database-items op te halen. Dit zijn de beschikbare databasetabellen. Voor elke tabel wordt met deze cmdlet ook het aantal tabelrijen opgehaald.

    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 gegevenstabel Werknemers in te stellen.

    Set-Location Employees
    
  4. We gaan nu de Get-Location cmdlet gebruiken om het pad naar de tabel Werknemers op te halen.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Gebruik nu de Get-Childitem cmdlet die naar de Format-Table cmdlet is doorgespijpt. Met deze set cmdlets worden de items opgehaald voor de gegevenstabel Werknemers, die de tabelrijen zijn. Ze zijn opgemaakt zoals opgegeven 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. U kunt nu de cmdlet uitvoeren om de items voor rij 0 van de gegevenstabel Get-Item Werknemers 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 werknemersgegevens voor 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

Een Windows PowerShell maken

Uw Windows PowerShell-provider ontwerpen

Objecttypen en -opmaak uitbreiden

Een Container Windows PowerShell implementeren

Cmdlets, providers en hosttoepassingen registreren

Handleiding voor Windows PowerShell-programmeurs

Windows PowerShell SDK