Skapa en Windows PowerShell-navigationsleverantör

Detta ämne beskriver hur man skapar en Windows PowerShell-navigationsleverantör som kan navigera i datalagret. Denna typ av leverantör stödjer rekursiva kommandon, nästlade containrar och relativa vägar.

Anmärkning

Du kan ladda ner C#-källfilen (AccessDBSampleProvider05.cs) för denna leverantör med hjälp av Microsoft Windows Software Development Kit för Windows Vista och .NET Framework 3.0 Runtime Components. För nedladdningsinstruktioner, se Hur man installerar Windows PowerShell och laddar ner Windows PowerShell SDK. De nedladdade källfilerna finns tillgängliga i <PowerShell Samples-katalogen> . För mer information om andra implementeringar av Windows PowerShell-leverantörer, se Designing Your Windows PowerShell Provider.

Den här beskrivna leverantören gör det möjligt för användaren att hantera en Access-databas som en enhet så att användaren kan navigera till datatabellerna i databasen. När du skapar din egen navigationsleverantör kan du implementera metoder som kan göra drivkvalificerade vägar nödvändiga för navigation, normalisera relativa vägar, flytta objekt i datalagret samt metoder som hämtar barnnamn, hämtar föräldravägen för ett objekt och testar om ett objekt är en container.

Försiktighet

Var medveten om att denna design förutsätter en databas som har ett fält med namn-ID, och att fältets typ är LongInteger.

Definiera Windows PowerShell-leverantören

En Windows PowerShell-navigationsleverantör måste skapa en .NET-klass som härstammar från basklassen System.Management.Automation.Provider.NavigationCmdletProvider . Här är klassdefinitionen för navigationsleverantören som beskrivs i detta avsnitt.

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

Observera att i denna leverantör innehåller attributet System.Management.Automation.Provider.CmdletProviderAttribute två parametrar. Den första parametern specificerar ett användarvänligt namn för leverantören som används av Windows PowerShell. Den andra parametern specificerar de Windows PowerShell-specifika funktioner som leverantören exponerar för Windows PowerShell-runtime under kommandobearbetningen. För denna leverantör finns inga Windows PowerShell-specifika funktioner som lagts till.

Definiera basfunktionalitet

Som beskrivs i Design Your PS Provider härstammar basklassen System.Management.Automation.Provider.NavigationCmdletProvider från flera andra klasser som gav olika leverantörsfunktionalitet. En Windows PowerShell-navigationsleverantör måste därför definiera all funktionalitet som tillhandahålls av dessa klasser.

För att implementera funktionalitet för att lägga till sessionsspecifik initialiseringsinformation och för att släppa resurser som används av leverantören, se Skapa en grundläggande PS-leverantör. De flesta leverantörer (inklusive den som beskrivs här) kan dock använda standardimplementeringen av denna funktionalitet som tillhandahålls av Windows PowerShell.

För att få tillgång till datalagret via en Windows PowerShell-enhet måste du implementera metoderna i basklassen System.Management.Automation.Provider.DriveCmdletProvider . För mer information om hur man implementerar dessa metoder, se Skapa en Windows PowerShell Drive Provider.

För att manipulera objekten i en datalagring, såsom att hämta, sätta och rensa objekt, måste leverantören implementera metoderna som tillhandahålls av Basklassen System.Management.Automation.Provider.ItemCmdletProvider . För mer information om hur man implementerar dessa metoder, se Skapa en Windows PowerShell Item Provider.

För att komma åt barnelementen, eller deras namn, i datalagret, samt metoder som skapar, kopierar, byter namn och tar bort objekt, måste du implementera de metoder som tillhandahålls av basklassen System.Management.Automation.Provider.ContainerCmdletProvider . För mer information om hur man implementerar dessa metoder, se Skapa en Windows PowerShell Container Provider.

Skapa en Windows PowerShell-sökväg

Windows PowerShell-navigationsleverantörer använder en leverantörsintern Windows PowerShell-väg för att navigera i datalagret. För att skapa en leverantörsintern sökväg måste leverantören implementera metoden System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* för att stödja anrop från Combine-Path-cmdleten. Denna metod kombinerar en förälder- och barnsökväg till en leverantörsintern väg, med hjälp av en leverantörsspecifik vägskiljare mellan förälder- och barnvägarna.

Standardimplementeringen tar vägar med "/" eller "\" som vägseparator, normaliserar vägseparatorn till "\", kombinerar föräldra- och barnvägsdelarna med separatorn mellan dem, och returnerar sedan en sträng som innehåller de kombinerade vägarna.

Denna navigationsleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* -metoden.

Saker att komma ihåg när man implementerar MakePath

Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:

Hämta föräldrabanan

Windows PowerShell-navigationsleverantörer implementerar metoden System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* för att hämta föräldradelen av den angivna fullständiga eller delvisa leverantörsspecifika vägen. Metoden tar bort barndelen av vägen och returnerar den föräldra-vägsdelen. Parametern root specificerar den fullt kvalificerade vägen till roten av en enhet. Denna parameter kan vara null eller tom om en monterad enhet inte används för återhämtningsoperationen. Om en rot anges måste metoden returnera en väg till en behållare i samma träd som roten.

Exempelnavigationsleverantören åsidosätter inte denna metod, utan använder standardimplementeringen. Den accepterar vägar som använder både "/" och "\" som vägseparatorer. Den normaliserar först sökvägen så att den bara har "\"-separatorer, sedan delar den av föräldravägen vid den sista "\" och returnerar föräldravägen.

Att komma ihåg att implementera GetParentPath

Din implementation av metoden System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* bör dela upp vägen lexikalt på vägseparatorn för providernamnrymden. Till exempel använder Filsystemleverantören denna metod för att leta efter sista "\" och returnerar allt till vänster om separatorn.

Hämta namnet på barnvägen

Din navigationsleverantör implementerar metoden System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* för att hämta namnet (bladelementet) på barnet till objektet som finns vid den angivna fullständiga eller partiella provider-specifika vägen.

Exempelnavigationsleverantören åsidosätter inte denna metod. Standardimplementeringen visas nedan. Den accepterar vägar som använder både "/" och "\" som vägseparatorer. Den normaliserar först vägen så att den bara har "\"-separatorer, sedan delar den av föräldravägen vid sista "\" och returnerar namnet på barnvägsdelen.

Saker att komma ihåg när man implementerar GetChildName

Din implementation av metoden System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* bör dela upp vägen lexikalt på vägseparatorn. Om den tillhandahållna vägen inte innehåller några vägseparatorer bör metoden returnera vägen oförändrad.

Viktigt!

Vägen som anges i anropet till denna metod kan innehålla tecken som är olagliga i providernamnrymden. Dessa tecken används troligen för jokerexpansion eller reguljära uttrycksmatchningar, och implementeringen av denna metod bör inte ta bort dem.

Att avgöra om en vara är en behållare

Navigationsleverantören kan implementera metoden System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* för att avgöra om den angivna vägen indikerar en container. Den returnerar true om sökvägen representerar en container, och false annars. Användaren behöver denna metod för att kunna använda cmdleten Test-Path för den medföljande sökvägen.

Följande kod visar System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer*- implementeringen i vår exempelnavigationsleverantör. Metoden verifierar att den angivna vägen är korrekt och om tabellen finns, och returnerar true om vä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 när du implementerar IsItemContainer

Din navigationsleverantörs .NET-klass kan deklarera leverantörsförmågor som ExpandWildcards, Filter, Inkludera eller Exkludera från System.Management.Automation.Provider.ProviderCapabilities-uppräkningen . I detta fall måste implementationen av System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* säkerställa att den godkända vägen uppfyller kraven. För att göra detta bör metoden komma åt rätt egenskap, till exempel egenskapen System.Management.Automation.Provider.CmdletProvider.Exclude* .

Flytta ett föremål

För att stödja Move-Item cmdleten implementerar din navigationsleverantör metoden System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Denna metod flyttar objektet som specificeras av parametern path till behållaren vid den väg som anges i parametern destination .

Exempelnavigationsleverantören åsidosätter inte System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* -metoden. Följande är standardimplementeringen.

Saker att komma ihåg när man implementerar MoveItem

Din navigationsleverantörs .NET-klass kan deklarera leverantörsförmågor som ExpandWildcards, Filter, Inkludera eller Exkludera från System.Management.Automation.Provider.ProviderCapabilities-uppräkningen . I detta fall måste implementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* säkerställa att den passerade vägen uppfyller kraven. För att göra detta bör metoden komma åt rätt egenskap, till exempel egenskapen CmdletProvider.Exlyde.

Som standard ska överskrivningar av denna metod inte flytta objekt över befintliga objekt om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är inställd på true. Till exempel kommer FileSystem-leverantören inte att kopiera C:\temp\abc.txt över en befintlig C:\bar.txt-fil om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är satt till true. Om vägen som anges i parametern destination finns och är en container, krävs inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* . I detta fall bör System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* flytta objektet som anges av parametern path till containern som anges av destination parametern som ett barn.

Din implementation 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. Denna metod används för att bekräfta att en operation utförs när en ändring görs i systemstatus, till exempel genom att radera filer. System.Management.Automation.Provider.CmdletProvider.ShouldProcess skickar namnet på resursen som ska ändras till användaren, där Windows PowerShell-runtime tar hänsyn till eventuella kommandoradsinställningar eller preferensvariabler vid avgörandet av vad som ska visas för användaren.

Efter anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess återvänder true, bör metoden System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* anropa metoden System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Denna metod skickar ett meddelande till användaren för att ge feedback om operationen ska fortsätta. Din leverantör bör ringa System.Management.Automation.Provider.CmdletProvider.ShouldContinue som en extra kontroll för potentiellt farliga systemändringar.

Att fästa dynamiska parametrar till Move-Item cmdleten

Ibland kräver cmdleten Move-Item ytterligare parametrar som tillhandahålls dynamiskt under körning. För att tillhandahålla dessa dynamiska parametrar måste navigationsleverantören implementera metoden System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* för att hämta de nödvändiga parametervärdena från objektet på den angivna sökvägen, och returnera ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt .

Denna navigationsleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normalisering av en relativ väg

Din navigationsleverantör implementerar metoden System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* för att normalisera den fullt kvalificerade vägen som anges i parametern path som relativ till den väg som parametern basePath specificerar. Metoden returnerar en strängrepresentation av den normaliserade vägen. Den skriver ett fel om parametern path anger en icke-existerande väg.

Exempelnavigationsleverantören åsidosätter inte denna metod. Följande är standardimplementeringen.

Saker att komma ihåg när man implementerar NormalizeRelativePath

Din implementation av System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* bör tolka parametern path , men den behöver inte använda enbart syntaktisk parsning. Du uppmuntras att designa denna metod för att använda sökvägen för att slå upp väginformationen i datalagringen och skapa en väg som matchar casing och standardiserad vägsyntax.

Kodexempel

För fullständig exempelkod, se AccessDbProviderSample05 Code Sample.

Definiera objekttyper och formatering

Det är möjligt för en leverantör att lägga till medlemmar till befintliga objekt eller definiera nya objekt. För mer information, seUtökning av objekttyper och formatering.

Bygger Windows PowerShell-leverantören

För mer information, se Hur man registrerar cmdlets, leverantörer och värdapplikationer.

Testning av Windows PowerShell-leverantören

När din Windows PowerShell-leverantör har registrerats hos Windows PowerShell kan du testa den genom att köra de stödda cmdlets på kommandoraden, inklusive cmdlets som görs tillgängliga via derivation. Detta exempel testar exempelnavigationsleverantören.

  1. Kör ditt nya shell och använd cmdleten Set-Location för att ställa in sökvägen som indikerar Access-databasen.

    Set-Location mydb:
    
  2. Kör nu cmdleten Get-ChildItem för att hämta en lista över databaselementen, som är de tillgängliga databastabellerna. För varje tabell hämtar denna cmdlet också 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 cmdleten Set-Location igen för att ställa in platsen för Employees-datatabellen.

    Set-Location Employees
    
  4. Låt oss nu använda cmdleten Get-Location för att hämta vägen till tabellen Employees.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Använd nu cmdleten Get-ChildItem som är kopplad till Format-Table cmdleten. Denna uppsättning cmdlets hämtar elementen för Employees-datatabellen, vilket är tabellraderna. De är formaterade enligt cmdlet-angivelsen Format-Table .

    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. Du kan nu köra cmdleten Get-Item för att hämta artiklar för rad 0 i Employees-datatabellen.

    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 cmdleten Get-Item igen för att hämta personaldata för punkterna i 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

Designa din Windows PowerShell-leverantör

Utvidgning av objekttyper och formatering

Implementera en Container Windows PowerShell-leverantör

Hur man registrerar cmdlets, leverantörer och värdapplikationer

Windows PowerShell Programmerarguide

Windows PowerShell SDK