Skapa en Windows PowerShell-navigeringsprovider

Det här avsnittet beskriver hur du skapar en Windows PowerShell som kan navigera i datalagret. Den här typen av provider stöder rekursiva kommandon, kapslade containrar och relativa sökvägar.

Anteckning

Du kan ladda ned C#-källfilen (AccessDBSampleProvider05.cs) för den här providern med hjälp av Microsoft Windows Software Development Kit för Windows Vista och .NET Framework 3.0 Runtime Components. Anvisningar för nedladdning finns i Installera Windows PowerShell och Ladda ned Windows PowerShell SDK. De nedladdade källfilerna är tillgängliga i <PowerShell Samples> katalogen . Mer information om andra Windows PowerShell-providerimplementering finns i Designing Your Windows PowerShell Provider (Utforma din Windows PowerShell provider).

Providern som beskrivs här gör att användaren kan hantera en Access-databas som en enhet så att användaren kan navigera till datatabellerna i databasen. När du skapar en egen navigeringsprovider kan du implementera metoder som kan göra att enhetskvalificerade sökvägar krävs för navigering, normalisera relativa sökvägar, flytta objekt i datalagret samt metoder som hämtar underordnade namn, hämtar den överordnade sökvägen för ett objekt och testar för att identifiera om ett objekt är en container.

Varning

Tänk på att den här designen förutsätter en databas som har ett fält med namnet ID och att fältets typ är LongInteger.

Definiera Windows PowerShell providern

En Windows PowerShell måste skapa en .NET-klass som härleds från basklassen System.Management.Automation.Provider.Navigationcmdletprovider. Här är klassdefinitionen för navigeringsprovidern som beskrivs i det här avsnittet.

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

Observera att attributet System.Management.Automation.Provider.Cmdletproviderattribute innehåller två parametrar i den här providern. Den första parametern anger ett användarvänligt namn för providern som används av Windows PowerShell. Den andra parametern anger Windows PowerShell specifika funktioner som providern exponerar för Windows PowerShell under kommandobearbetningen. För den här providern finns det Windows PowerShell specifika funktioner som läggs till.

Definiera grundläggande funktioner

Enligt beskrivningen i Designa ps-providernhärleds basklassen System.Management.Automation.Provider.Navigationcmdletprovider från flera andra klasser som tillhandahöll olika providerfunktioner. En Windows PowerShell måste därför definiera alla funktioner som tillhandahålls av dessa klasser.

Information om hur du implementerar funktioner för att lägga till sessionsspecifik initieringsinformation och för att frigöra resurser som används av providern finns i Skapa en grundläggande PS-provider. De flesta leverantörer (inklusive providern som beskrivs här) kan dock använda standardimplementering av den här funktionen som tillhandahålls av Windows PowerShell.

För att få åtkomst till datalagret via en Windows PowerShell enhet måste du implementera metoderna i basklassen System.Management.Automation.Provider.Drivecmdletprovider. Mer information om hur du implementerar dessa metoder finns i Creating a Windows PowerShell Drive Provider.

Om du vill ändra objekten i ett datalager, till exempel hämta, ange och rensa objekt, måste providern implementera de metoder som tillhandahålls av basklassen System.Management.Automation.Provider.Itemcmdletprovider. Mer information om hur du implementerar dessa metoder finns i Creating an Windows PowerShell Item Provider.

För att komma till de underordnade objekten, eller deras namn, för datalagret, samt metoder som skapar, kopierar, byter namn på och tar bort objekt, måste du implementera de metoder som tillhandahålls av basklassen System.Management.Automation.Provider.Containercmdletprovider. Mer information om hur du implementerar dessa metoder finns i Skapa en Windows PowerShell containerprovider.

Skapa en Windows PowerShell sökväg

Windows PowerShell navigeringsprovidern använder en intern providersökväg Windows PowerShell navigera i objekten i datalagret. Om du vill skapa en provider-intern sökväg måste providern implementera metoden System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* för att stödja anrop från Combine-Path-cmdleten. Den här metoden kombinerar en överordnad och underordnad sökväg till en provider-intern sökväg, med hjälp av en providerspecifik sökvägsavgränsare mellan den överordnade och underordnade sökvägen.

Standardimplementering tar sökvägar med "/" eller " " som \ sökvägsavgränsare, normaliserar sökvägsavgränsaren till " ", kombinerar de överordnade och underordnade sökvägsdelarna med avgränsaren mellan dem och returnerar sedan en sträng som innehåller de kombinerade \ sökvägarna.

Den här navigeringsprovidern implementerar inte den här metoden. Följande kod är dock standardimplementering av metoden System.Management.Automation.Provider.Navigationcmdletprovider.Makepath*.

Saker att komma ihåg om att implementera MakePath

Följande villkor kan gälla för din implementering av System.Management.Automation.Provider.Navigationcmdletprovider.Makepath*:

Hämta den överordnade sökvägen

Windows PowerShell-navigeringsleverantörer implementerar metoden System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* för att hämta den överordnade delen av den angivna fullständiga eller partiella providerspecifika sökvägen. Metoden tar bort den underordnade delen av sökvägen och returnerar den överordnade sökvägsdelen. Parametern root anger den fullständigt kvalificerade sökvägen till roten på en enhet. Den här parametern kan vara null eller tom om en monterad enhet inte används för hämtningsåtgärden. Om en rot anges måste metoden returnera en sökväg till en container i samma träd som roten.

Exempelnavigeringsprovidern åsidosätter inte den här metoden, men använder standardimplementering. Den accepterar sökvägar som använder både "/" och \ " som sökvägsavgränsare. Den normaliserar först sökvägen så att den bara har " " avgränsare och delar sedan den överordnade sökvägen av vid den sista \ " \ " och returnerar den överordnade sökvägen.

Kom ihåg att implementera GetParentPath

Implementeringen av metoden System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* bör dela upp sökvägen lexikalt på sökvägsavgränsaren för providernamnområdet. Till exempel använder filsystemsprovidern den här metoden för att leta efter den sista " " och \ returnerar allt till vänster om avgränsaren.

Hämta namnet på den underordnade sökvägen

Navigeringsprovidern implementerar metoden System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname* för att hämta namnet (lövelementet) på det underordnade objektet som finns på den angivna fullständiga eller partiella providerspecifika sökvägen.

Exempelnavigeringsprovidern åsidosätter inte den här metoden. Standardimplementering visas nedan. Den accepterar sökvägar som använder både "/" och \ " som sökvägsavgränsare. Den normaliserar först sökvägen så att den bara har " " avgränsare och delar sedan den överordnade sökvägen av vid den sista " " och returnerar namnet på den \ \ underordnade sökvägsdelen.

Saker att komma ihåg om att implementera GetChildName

Implementeringen av metoden System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname* ska dela sökvägen lexikalt på sökvägsavgränsaren. Om den angivna sökvägen inte innehåller några sökvägsavgränsare ska metoden returnera sökvägen oförändrad.

Viktigt

Sökvägen som anges i anropet till den här metoden kan innehålla tecken som är ogiltiga i providernamnrymden. Dessa tecken används troligen för jokerteckenexpansion eller matchning av reguljära uttryck, och implementeringen av den här metoden bör inte ta bort dem.

Avgöra om ett objekt är en container

Navigeringsprovidern kan implementera metoden System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* för att avgöra om den angivna sökvägen anger en container. Det returnerar true om sökvägen representerar en container och annars false. Användaren behöver den här metoden för att kunna använda Test-Path cmdleten för den angivna sökvägen.

Följande kod visar implementeringen System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* i vår exempelnavigeringsprovider. Metoden verifierar att den angivna sökvägen är korrekt och om tabellen finns och returnerar true om sökvägen indikerar en container.

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

Saker att komma ihåg om att implementera IsItemContainer

Din .NET-klass för navigeringsprovidern kan deklarera providerfunktioner för ExpandWildcards, Filter, Include eller Exclude från uppräkningen System.Management.Automation.Provider.Providercapabilities. I det här fallet måste implementeringen av System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* se till att den sökväg som skickas uppfyller kraven. För att göra detta ska metoden komma åt lämplig egenskap, till exempel egenskapen System.Management.Automation.Provider.Cmdletprovider.Exclude*.

Flytta ett objekt

Som stöd för Move-Item cmdleten implementerar navigeringsleverantören metoden System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem*. Den här metoden flyttar objektet som anges av path parametern till containern på den sökväg som anges i destination parametern .

Exempelnavigeringsprovidern åsidosätter inte metoden System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem*. Följande är standardimplementering.

Saker att komma ihåg om att implementera MoveItem

Din .NET-klass för navigeringsprovidern kan deklarera providerfunktioner för ExpandWildcards, Filter, Include eller Exclude från uppräkningen System.Management.Automation.Provider.Providercapabilities. I det här fallet måste implementeringen av System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* se till att den sökväg som skickas uppfyller kraven. För att göra detta ska metoden komma åt lämplig egenskap, till exempel egenskapen CmdletProvider.Exclude.

Som standard ska åsidosättningar av den här metoden inte flytta objekt över befintliga objekt om inte egenskapen System.Management.Automation.Provider.Cmdletprovider.Force* har angetts till true . Filsystemsprovidern kopierar till exempel inte c:\temp\abc.txt över en befintlig c:\bar.txt-fil om inte egenskapen System.Management.Automation.Provider.Cmdletprovider.Force* har angetts till true . Om sökvägen som anges i parametern finns och är en container krävs inte egenskapen destination System.Management.Automation.Provider.Cmdletprovider.Force*. I det här fallet ska System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* flytta objektet som anges av parametern till den container som anges av parametern som path destination underordnad.

Implementeringen av metoden System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* bör anropa System.Management.Automation.Provider.Cmdletprovider.ShouldProcess och kontrollera dess returvärde innan du gör några ändringar i datalagret. Den här metoden används för att bekräfta körningen av en åtgärd när en ändring görs i systemtillståndet, till exempel borttagning av filer. System.Management.Automation.Provider.Cmdletprovider.ShouldProcess skickar namnet på resursen som ska ändras till användaren, där Windows PowerShell-körningen tar hänsyn till eventuella kommandoradsinställningar eller inställningsvariabler för att fastställa vad som ska visas för användaren.

Efter anropet till System.Management.Automation.Provider.Cmdletprovider.ShouldProcess returnerar , ska metoden true System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* anropa metoden System.Management.Automation.Provider.Cmdletprovider.ShouldContinue. Den här metoden skickar ett meddelande till användaren för att tillåta feedback för att säga om åtgärden ska fortsätta. Din leverantör bör anropa System.Management.Automation.Provider.Cmdletprovider.ShouldContinue som ytterligare en kontroll för potentiellt farliga systemändringar.

Koppla dynamiska parametrar till Move-Item cmdlet

Ibland kräver Move-Item cmdleten ytterligare parametrar som tillhandahålls dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste navigeringsprovidern implementera metoden System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters* för att hämta nödvändiga parametervärden från objektet på den angivna sökvägen och returnera ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller ett System.Management.Automation.Runtimedefinedparameterdictionary-objekt.

Den här navigeringsprovidern implementerar inte den här metoden. Följande kod är dock standardimplementering av System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters*.

Normalisera en relativ sökväg

Navigeringsprovidern implementerar metoden System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* för att normalisera den fullständigt kvalificerade sökvägen som anges i parametern som relativ till den sökväg som anges av path basePath parametern. Metoden returnerar en strängrepresentation av den normaliserade sökvägen. Den skriver ett fel om path parametern anger en sökväg som inte finns.

Exempelnavigeringsprovidern åsidosätter inte den här metoden. Följande är standardimplementering.

Saker att komma ihåg om att implementera NormalizeRelativePath

Implementeringen av System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* ska parsa parametern, men den behöver inte använda enbart path syntaktisk parsning. Du uppmanas att utforma den här metoden för att använda sökvägen för att leta upp sökvägsinformationen i datalagret och skapa en sökväg som matchar höljet och den standardiserade sökvägssyntaxen.

Kodexempel

Fullständig exempelkod finns i AccessDbProviderSample05 Code Sample.

Definiera objekttyper och formatering

Det är möjligt för en provider att lägga till medlemmar i befintliga objekt eller definiera nya objekt. Mer information finns i Utökaobjekttyper och formatera.

Skapa Windows PowerShell leverantör

Mer information finns i Registrera cmdlets, providers och värdprogram.

Testa Windows PowerShell providern

När din Windows PowerShell-provider har registrerats med Windows PowerShell kan du testa den genom att köra de cmdlets som stöds på kommandoraden, inklusive cmdlets som gjorts tillgängliga av härledning. Det här exemplet testar exempelnavigeringsprovidern.

  1. Kör det nya gränssnittet och använd Set-Location cmdleten för att ange sökvägen som anger Access-databasen.

    Set-Location mydb:
    
  2. Kör nu Get-Childitem cmdleten för att hämta en lista över databasobjekten, som är tillgängliga databastabeller. För varje tabell hämtar denna cmdlet även antalet tabellrader.

    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. Använd Set-Location cmdleten igen för att ange platsen för datatabellen Anställda.

    Set-Location Employees
    
  4. Nu ska vi använda Get-Location cmdleten för att hämta sökvägen till tabellen Anställda.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Använd nu Get-Childitem cmdleten piped till Format-Table cmdleten . Den här uppsättningen cmdlets hämtar objekten för datatabellen Anställda, som är tabellraderna. De formateras enligt Format-Table cmdleten .

    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. Nu kan du köra Get-Item cmdleten för att hämta objekten för rad 0 i datatabellen Anställda.

    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. Använd Get-Item cmdleten igen för att hämta medarbetardata för objekten på rad 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
    

Se även

Skapa Windows PowerShell leverantörer

Utforma din Windows PowerShell provider

Utöka objekttyper och formatering

Implementera en Container Windows PowerShell provider

Registrera cmdlets, providers och värdprogram

Programmeringsguide för Windows PowerShell

Windows PowerShell SDK