Dela via


Skapa en Windows PowerShell-navigeringsprovider

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

Anmärkning

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. Instruktioner för nedladdning finns i Så här installerar du Windows PowerShell och laddar ned Windows PowerShell SDK. De nedladdade källfilerna är tillgängliga i katalogen <PowerShell-exempel>. Mer information om andra Implementeringar av Windows PowerShell-providern finns i Designing Your 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 enhetskvalificerade sökvägar som krävs för navigering, normalisera relativa sökvägar, flytta objekt i datalagret samt metoder som hämtar underordnade namn, hämta den överordnade sökvägen för ett objekt och testa för att identifiera om ett objekt är en container.

Försiktighet

Tänk på att den här designen förutsätter en databas som har ett fält med namn-ID och att typen av fält är LongInteger.

Definiera Windows PowerShell-providern

En Windows PowerShell-navigeringsprovider måste skapa en .NET-klass som härleds från System.Management.Automation.Provider.NavigationCmdletProvider basklass. 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 i den här providern innehåller två parametrar. Den första parametern anger ett användarvänligt namn för providern som används av Windows PowerShell. Den andra parametern anger de Windows PowerShell-specifika funktioner som providern exponerar för Windows PowerShell-körningen under kommandobearbetningen. För den här providern finns det inga Windows PowerShell-specifika funktioner som läggs till.

Definiera basfunktioner

Enligt beskrivningen i Design Your PS Providerhärleds System.Management.Automation.Provider.NavigationCmdletProvider basklass från flera andra klasser som tillhandahåller olika providerfunktioner. En Windows PowerShell-navigeringsprovider 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 standardimplementeringen 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 System.Management.Automation.Provider.DriveCmdletProvider basklass. Mer information om hur du implementerar dessa metoder finns i Skapa en Windows PowerShell-enhetsprovider.

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 System.Management.Automation.Provider.ItemCmdletProvider basklass. Mer information om hur du implementerar dessa metoder finns i Skapa en Windows PowerShell-objektprovider.

För att komma till underordnade objekt, eller deras namn, för datalagret, samt metoder som skapar, kopierar, byter namn på och tar bort objekt, måste du implementera metoderna som tillhandahålls av System.Management.Automation.Provider.ContainerCmdletProvider basklass. 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 providerintern Windows PowerShell-sökväg för att navigera i datalagrets objekt. Om du vill skapa en providerintern sökväg måste providern implementera metoden System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* för att kunna använda anrop från cmdleten Combine-Path. 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 överordnade och underordnade sökvägar.

Standardimplementeringen 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 standardimplementeringen 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 implementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:

Hämtar den överordnade sökvägen

Windows PowerShell-navigeringsprovidrar 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 har angetts 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 standardimplementeringen. 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, sedan delas 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* ska dela sökvägen lexikalt på sökvägsavgränsaren för providernamnområdet. FileSystem-providern använder till exempel 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 System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* metod för att hämta namnet (lövelementet) på det underordnade objektet på den angivna fullständiga eller partiella providerspecifika sökvägen.

Exempelnavigeringsprovidern åsidosätter inte den här metoden. Standardimplementeringen 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 till att bara ha "\" avgränsare, sedan delas den överordnade sökvägen av vid den sista "\" och returnerar namnet på den underordnade sökvägsdelen.

Saker att komma ihåg när du implementerar 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 bör 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 providerns namnområde. 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. Den returnerar sant om sökvägen representerar en container och annars falskt. Användaren behöver den här metoden för att kunna använda cmdleten Test-Path för den angivna sökvägen.

Följande kod visar System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* implementering 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 anger 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 System.Management.Automation.Provider.ProviderCapabilities uppräkning. I det här fallet måste implementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* se till att sökvägen uppfyller kraven. För att göra detta bör metoden komma åt lämplig egenskap, till exempel egenskapen System.Management.Automation.Provider.CmdletProvider.Exclude*.

Flytta ett objekt

Till stöd för cmdleten Move-Item implementerar navigeringsprovidern metoden System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*. Den här metoden flyttar objektet som anges av parametern path till containern på sökvägen som anges i parametern destination.

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

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 System.Management.Automation.Provider.ProviderCapabilities uppräkning. I det här fallet måste implementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* se till att sökvägen uppfyller kraven. För att göra detta bör metoden komma åt lämplig egenskap, till exempel egenskapen CmdletProvider.Exclude.

Som standard bör åsidosättningar av den här metoden inte flytta objekt över befintliga objekt om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är inställd på true. FileSystem-providern kopierar till exempel inte C:\temp\abc.txt över en befintlig C:\bar.txt-fil om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är inställd på true. Om sökvägen som anges i parametern destination finns och är en container krävs inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force*. I det här fallet bör System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* flytta objektet som anges av parametern path till containern som anges av parametern destination som underordnad.

Din implementering av System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*-metoden 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 när filer tas bort. 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 avgöra vad som ska visas för användaren.

Efter anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess returnerar trueska System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*-metoden anropa metoden System.Management.Automation.Provider.CmdletProvider.ShouldContinue metod. Den här metoden skickar ett meddelande till användaren för att tillåta feedback om åtgärden ska fortsätta. Leverantören bör anropa System.Management.Automation.Provider.CmdletProvider.ShouldContinue som ytterligare en kontroll för potentiellt farliga systemändringar.

Koppla dynamiska parametrar till cmdleten Move-Item

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 System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*-metoden för att hämta de obligatoriska parametervärdena 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 en System.Management.Automation.RuntimeDefinedParameterDictionary objekt.

Den här navigeringsprovidern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.

Normalisera en relativ sökväg

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

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

Saker att komma ihåg om att implementera NormalizeRelativePath

Implementeringen av System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* ska parsa parametern path, men den behöver inte använda enbart 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 standardsö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 iUtöka objekttyper och formatering.

Skapa Windows PowerShell-providern

Mer information finns i Registrera cmdletar, leverantörer 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 cmdletar som stöds på kommandoraden, inklusive cmdletar som görs tillgängliga genom härledning. Det här exemplet testar exempelnavigeringsprovidern.

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

    Set-Location mydb:
    
  2. Kör nu cmdleten Get-ChildItem för att hämta en lista över databasobjekten, som är tillgängliga databastabeller. För varje tabell hämtar den här cmdleten 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 ange platsen för datatabellen Anställda.

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

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Använd nu cmdleten Get-ChildItem som skickas till cmdleten Format-Table. Den här uppsättningen cmdletar hämtar objekten för datatabellen Anställda, som är tabellraderna. De formateras enligt cmdleten 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. Nu kan du köra cmdleten Get-Item 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 cmdleten Get-Item igen för att hämta de anställdas data för objekten 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-providers

Utforma Din Windows PowerShell-provider

utöka objekttyper och formatering

Implementera en Windows PowerShell-containerprovider

Registrera cmdletar, leverantörer och värdprogram

Windows PowerShell-programmerarens guide

Windows PowerShell SDK