Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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*:
Din implementering av metoden System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* ska inte verifiera sökvägen som en laglig fullständigt kvalificerad sökväg i providernamnområdet. Tänk på att varje parameter bara kan representera en del av en sökväg och att de kombinerade delarna kanske inte genererar en fullständigt kvalificerad sökväg. Till exempel kan System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*-metoden för FileSystem-providern ta emot "windows\system32" i parametern
parentoch "abc.dll" i parameternchild. Metoden kopplar dessa värden till "\"-avgränsaren och returnerar "windows\system32\abc.dll", vilket inte är en fullständigt kvalificerad filsystemsökväg.Viktigt!
Sökvägsdelarna i anropet till System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* kan innehålla tecken som inte tillåts i providerns namnområde. Dessa tecken används troligen för jokerteckenexpansion och implementeringen av den här metoden bör inte ta bort dem.
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.
Kör det nya gränssnittet och använd cmdleten
Set-Locationför att ange sökvägen för att ange Access-databasen.Set-Location mydb:Kör nu cmdleten
Get-ChildItemfö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 -AutoSizeRowCount 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 SuppliersAnvänd cmdleten
Set-Locationigen för att ange platsen för datatabellen Anställda.Set-Location EmployeesNu ska vi använda cmdleten
Get-Locationför att hämta sökvägen till tabellen Anställda.Get-LocationPath ---- mydb:\EmployeesAnvänd nu cmdleten
Get-ChildItemsom skickas till cmdletenFormat-Table. Den här uppsättningen cmdletar hämtar objekten för datatabellen Anställda, som är tabellraderna. De formateras enligt cmdletenFormat-Table.Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSizeRowNumber 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.DataRowNu kan du köra cmdleten
Get-Itemför att hämta objekten för rad 0 i datatabellen Anställda.Get-Item 0PSPath : 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 : 0Använd cmdleten
Get-Itemigen för att hämta de anställdas data för objekten i rad 0.(Get-Item 0).DataEmployeeID : 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