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*:
Implementeringen av metoden System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* bör inte validera sökvägen som en juridisk, fullständigt kvalificerad sökväg i providernamnområdet. Tänk på att varje parameter endast 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 metoden System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* för filsystemprovidern få "windows\system32" i
parentparametern och "abc.dll" ichildparametern . Metoden sammanfogar dessa värden med " " 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 providernamnrymden. Dessa tecken används troligen för jokerteckenexpansion och implementeringen av den här metoden bör inte ta bort dem.
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.
Kör det nya gränssnittet och använd
Set-Locationcmdleten för att ange sökvägen som anger Access-databasen.Set-Location mydb:Kör nu
Get-Childitemcmdleten 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 -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
Set-Locationcmdleten igen för att ange platsen för datatabellen Anställda.Set-Location EmployeesNu ska vi använda
Get-Locationcmdleten för att hämta sökvägen till tabellen Anställda.Get-LocationPath ---- mydb:\EmployeesAnvänd nu
Get-Childitemcmdleten piped tillFormat-Tablecmdleten . Den här uppsättningen cmdlets hämtar objekten för datatabellen Anställda, som är tabellraderna. De formateras enligtFormat-Tablecmdleten .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
Get-Itemcmdleten fö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
Get-Itemcmdleten igen för att hämta medarbetardata för objekten på 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 leverantörer
Utforma din Windows PowerShell provider
Utöka objekttyper och formatering
Implementera en Container Windows PowerShell provider
Registrera cmdlets, providers och värdprogram
Feedback
Skicka och visa feedback för