Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit onderwerp beschrijft hoe je een Windows PowerShell-navigatieprovider kunt maken die de datastore kan navigeren. Dit type provider ondersteunt recursieve commando's, geneste containers en relatieve paden.
Opmerking
Je kunt het C#-bronbestand (AccessDBSampleProvider05.cs) van deze provider downloaden met behulp van de Microsoft Windows Software Development Kit voor Windows Vista en .NET Framework 3.0 Runtime Components. Voor downloadinstructies, zie Hoe installeer je Windows PowerShell en download de Windows PowerShell SDK. De gedownloade bronbestanden zijn beschikbaar in de <PowerShell Samples-map> . Voor meer informatie over andere implementaties van Windows PowerShell-providers, zie Designing Your Windows PowerShell Provider.
De hier beschreven provider stelt de gebruiker in staat een Access-database als een schijf te beheren, zodat de gebruiker naar de datatabellen in de database kan navigeren. Bij het creëren van je eigen navigatieprovider kun je methoden implementeren waarmee schijfgekwalificeerde paden nodig zijn voor navigatie, relatieve paden worden genormaliseerd, items uit de datastore kunnen verplaatsen, evenals methoden die kindnamen ophalen, het ouderpad van een item krijgen en testen of een item een container is.
Waarschuwing
Wees je ervan bewust dat dit ontwerp uitgaat van een database met een veld met de naam-ID, en dat het type veld LongInteger is.
Definieer de Windows PowerShell-provider
Een Windows PowerShell-navigatieprovider moet een .NET-klasse aanmaken die is afgeleid van de System.Management.Automation.Provider.NavigationCmdletProvider-basisklasse . Hier is de klasse-definitie voor de navigatieprovider die in deze sectie wordt beschreven.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
Let op dat in deze provider het attribuut System.Management.Automation.Provider.CmdletProviderAttribute twee parameters bevat. De eerste parameter specificeert een gebruiksvriendelijke naam voor de provider die door Windows PowerShell wordt gebruikt. De tweede parameter specificeert de Windows PowerShell-specifieke mogelijkheden die de provider tijdens de commandoverwerking aan de Windows PowerShell-runtime blootstelt. Voor deze provider zijn er geen Windows PowerShell-specifieke mogelijkheden toegevoegd.
Basisfunctionaliteit definiëren
Zoals beschreven in Design Your PS Provider, is de basisklasse System.Management.Automation.Provider.NavigationCmdletProvider afgeleid van verschillende andere klassen die verschillende providerfunctionaliteit boden. Een Windows PowerShell-navigatieprovider moet daarom alle functionaliteit definiëren die door die klassen wordt geleverd.
Om functionaliteit te implementeren voor het toevoegen van sessie-specifieke initialisatie-informatie en het vrijgeven van bronnen die door de provider worden gebruikt, zie Een Basic PS Provider aanmaken. De meeste providers (inclusief de hier beschreven provider) kunnen echter de standaardimplementatie van deze functionaliteit gebruiken die door Windows PowerShell wordt aangeboden.
Om toegang te krijgen tot de datastore via een Windows PowerShell-schijf, moet je de methoden van de System.Management.Automation.Provider.DriveCmdletProvider-basisklasse implementeren. Voor meer informatie over het implementeren van deze methoden, zie Het aanmaken van een Windows PowerShell Drive Provider.
Om de items van een datawinkel te manipuleren, zoals het ophalen, instellen en wissen van items, moet de provider de methoden implementeren die worden geleverd door de System.Management.Automation.Provider.ItemCmdletProvider-basisklasse . Voor meer informatie over het implementeren van deze methoden, zie Het aanmaken van een Windows PowerShell Item Provider.
Om bij de kinditems, of hun namen, van de datastore te komen, evenals bij methoden die items aanmaken, kopiëren, hernoemen en verwijderen, moet je de methoden implementeren die worden geleverd door de basisklasse System.Management.Automation.Provider.ContainerCmdletProvider . Voor meer informatie over het implementeren van deze methoden, zie Het aanmaken van een Windows PowerShell Container Provider.
Een Windows PowerShell-pad aanmaken
Windows PowerShell-navigatieproviders gebruiken een provider-intern Windows PowerShell-pad om de items van de datastore te navigeren. Om een provider-intern pad te creëren, moet de provider de methode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* implementeren om aanroepen van de Combine-Path cmdlet te ondersteunen. Deze methode combineert een ouder- en kindpad tot een provider-intern pad, waarbij een provider-specifieke padseparator tussen de ouder- en kindpaden wordt gebruikt.
De standaardimplementatie neemt paden met "/" of "\" als padscheider, normaliseert de padafscheider naar "\", combineert de ouder- en kindpaddelen met de scheider ertussen, en geeft vervolgens een string terug die de gecombineerde paden bevat.
Deze navigatieprovider implementeert deze methode niet. De volgende code is echter de standaardimplementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* -methode.
Dingen om te onthouden bij het implementeren van MakePath
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:
Uw implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* -methode zou het pad niet moeten valideren als een juridisch volledig gekwalificeerd pad in de providernaamruimte. Wees je ervan bewust dat elke parameter slechts een deel van een pad kan representeren, en dat de gecombineerde delen mogelijk geen volledig gekwalificeerd pad genereren. Bijvoorbeeld, de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* -methode voor de FileSystem-provider kan "windows\system32" in de
parentparameter en "abc.dll" in dechildparameter ontvangen. De methode voegt deze waarden samen met de "\"-scheider en geeft "windows\system32\abc.dll" terug, wat geen volledig gekwalificeerd bestandssysteempad is.Belangrijk
De paddelen die in de aanroep naar System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* worden aangeboden, kunnen tekens bevatten die niet zijn toegestaan in de providernaamruimte. Deze personages worden waarschijnlijk gebruikt voor wildcard-uitbreiding en de implementatie van deze methode zou ze niet moeten verwijderen.
Het Ouderpad ophalen
Windows PowerShell-navigatieproviders implementeren de methode System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* om het oudergedeelte van het aangegeven volledige of gedeeltelijke provider-specifieke pad op te halen. De methode verwijdert het kindgedeelte van het pad en geeft het ouderpadgedeelte terug. De root parameter specificeert het volledig gekwalificeerde pad naar de wortel van een schijf. Deze parameter kan nul of leeg zijn als een gemonteerde schijf niet wordt gebruikt voor de ophaaloperatie. Als een wortel wordt gespecificeerd, moet de methode een pad teruggeven naar een container in dezelfde boom als de wortel.
De voorbeeldnavigatieprovider overschrijft deze methode niet, maar gebruikt de standaardimplementatie. Het accepteert paden die zowel "/" als "\" als padseparators gebruiken. Eerst normaliseert het het pad zodat het alleen "\"-scheiders heeft, splitst dan het ouderpad af bij de laatste "\" en geeft het ouderpad terug.
Om te onthouden hoe je GetParentPath implementeert
Je implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* methode moet het pad lexicaal splitsen op de padseparator voor de providernaamruimte. Bijvoorbeeld, de FileSystem-provider gebruikt deze methode om de laatste "\" te zoeken en alles links van de scheidingsmeter terug te geven.
Haal de naam van het kindpad op
Je navigatieprovider implementeert de methode System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* om de naam (bladelement) van het kind van het item op te halen dat zich bevindt op het aangegeven volledige of gedeeltelijke, provider-specifieke pad.
De voorbeeldnavigatieprovider overschrijft deze methode niet. De standaardimplementatie wordt hieronder getoond. Het accepteert paden die zowel "/" als "\" als padseparators gebruiken. Eerst wordt het pad genormaliseerd zodat het alleen "\"-scheiders heeft, daarna splitst het ouderpad af bij de laatste "\" en geeft de naam van het kindpadgedeelte terug.
Dingen om te onthouden bij het implementeren van GetChildName
Je implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* methode moet het pad lexicaal splitsen op de padscheider. Als het aangeleverde pad geen padscheiders bevat, moet de methode het pad ongewijzigd teruggeven.
Belangrijk
Het pad dat in de aanroep naar deze methode wordt gegeven, kan tekens bevatten die illegaal zijn in de providernaamruimte. Deze tekens worden waarschijnlijk gebruikt voor wildcard-uitbreiding of reguliere expressiematching, en de implementatie van deze methode zou ze niet moeten verwijderen.
Bepalen of een Item een Container is
De navigatieprovider kan de methode System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* implementeren om te bepalen of het opgegeven pad een container aangeeft. Het geeft waar terug als het pad een container vertegenwoordigt, en anders vals. De gebruiker heeft deze methode nodig om de Test-Path cmdlet te kunnen gebruiken voor het geleverde pad.
De volgende code toont de System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer*- implementatie in onze voorbeeldnavigatieprovider. De methode verifieert dat het opgegeven pad correct is en of de tabel bestaat, en geeft true terug als het pad een container aangeeft.
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
Dingen om te onthouden bij het implementeren van IsItemContainer
Je navigatieprovider .NET-klasse kan providercapaciteiten ExpandWildcards, Filter, Include, of Exclude aangeven uit de System.Management.Automation.Provider.ProviderCapabilities-enumeratie . In dit geval moet de implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* ervoor zorgen dat het doorgegeven pad aan de eisen voldoet. Om dit te doen, moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschap System.Management.Automation.Provider.CmdletProvider.Exclusivlude* .
Een voorwerp verplaatsen
Ter ondersteuning van de Move-Item cmdlet implementeert uw navigatieprovider de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* -methode. Deze methode verplaatst het item dat door de path parameter is gespecificeerd naar de container op het pad dat in de destination parameter wordt opgegeven.
De voorbeeldnavigatieprovider overschrijft de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* -methode niet. Het volgende is de standaardimplementatie.
Dingen om te onthouden bij het implementeren van MoveItem
Je navigatieprovider .NET-klasse kan providercapaciteiten ExpandWildcards, Filter, Include, of Exclude aangeven uit de System.Management.Automation.Provider.ProviderCapabilities-enumeratie . In dit geval moet de implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* ervoor zorgen dat het doorgegeven pad aan de eisen voldoet. Om dit te doen, moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschap CmdletProvider.Exlyude .
Standaard zouden overrides van deze methode geen objecten over bestaande objecten moeten verplaatsen, tenzij de eigenschap System.Management.Automation.Provider.CmdletProvider.Force* is ingesteld op true. De FileSystem-provider kopieert bijvoorbeeld C:\temp\abc.txt niet over een bestaand C:\bar.txt-bestand tenzij de eigenschap System.Management.Automation.Provider.CmdletProvider.Force* is ingesteld op true. Als het pad dat in de destination parameter is gespecificeerd bestaat en een container is, is de eigenschap System.Management.Automation.Provider.CmdletProvider.Force* niet vereist. In dit geval moet System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* het item dat door de path parameter wordt aangeduid naar de container verplaatsen destination als kind.
Je implementatie van de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* methode moet System.Management.Automation.Provider.CmdletProvider.ShouldProcess aanroepen en de retourwaarde controleren voordat je wijzigingen aanbrengt in de datastore. Deze methode wordt gebruikt om de uitvoering van een operatie te bevestigen wanneer er een wijziging in de systeemstatus wordt aangebracht, bijvoorbeeld het verwijderen van bestanden. System.Management.Automation.Provider.CmdletProvider.ShouldProcess stuurt de naam van de te wijzigen resource naar de gebruiker, waarbij de Windows PowerShell-runtime rekening houdt met eventuele commandoregelinstellingen of voorkeursvariabelen bij het bepalen wat aan de gebruiker getoond moet worden.
Nadat de aanroep van System.Management.Automation.Provider.CmdletProvider.ShouldProcess terugkeert true, moet de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* methode de methode System.Management.Automation.Provider.CmdletProvider.ShouldContinue aanroepen. Deze methode stuurt een bericht naar de gebruiker om feedback te geven of de bewerking moet worden voortgezet. Uw provider moet System.Management.Automation.Provider.CmdletProvider.ShouldContinue bellen als extra controle op mogelijk gevaarlijke systeemaanpassingen.
Dynamische parameters toevoegen aan de Move-Item cmdlet
Soms vereist de Move-Item cmdlet extra parameters die dynamisch tijdens runtime worden geleverd. Om deze dynamische parameters te bieden, moet de navigatieprovider de methode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* implementeren om de vereiste parameterwaarden van het item op het aangegeven pad te krijgen, en een object teruggeven met eigenschappen en velden met parsingattributen vergelijkbaar met een cmdlet-klasse of een System.Management.Automation.RuntimeDefinedParameterDictionary-object .
Deze navigatieprovider implementeert deze methode niet. De volgende code is echter de standaardimplementatie van System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.
Normaliseren van een relatief pad
Je navigatieprovider implementeert de methode System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* om het volledig gekwalificeerde pad dat in de path parameter is aangegeven als relatief aan het door de basePath parameter gespecificeerde pad te normaliseren. De methode geeft een stringrepresentatie van het genormaliseerde pad terug. Het schrijft een fout als de path parameter een niet-bestaand pad specificeert.
De voorbeeldnavigatieprovider overschrijft deze methode niet. Het volgende is de standaardimplementatie.
Dingen om te onthouden bij het implementeren van NormalizeRelativePath
Je implementatie van System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* zou de path parameter moeten parsen, maar hoeft niet uitsluitend syntactische parsing te gebruiken. Je wordt aangemoedigd deze methode te ontwerpen om het pad te gebruiken om de padinformatie in de datastore op te zoeken en een pad te creëren dat overeenkomt met de casing en de gestandaardiseerde padsyntaxis.
Codevoorbeeld
Voor volledige voorbeeldcode, zie AccessDbProviderSample05 Code Voorbeeld.
Objecttypes en opmaak definiëren
Het is mogelijk voor een provider om leden toe te voegen aan bestaande objecten of nieuwe objecten te definiëren. Voor meer informatie, zieUitbreiden van Objecttypes en Opmaak.
Het bouwen van de Windows PowerShell-provider
Voor meer informatie, zie Hoe registreer je cmdlets, providers en hostapplicaties.
De Windows PowerShell-provider testen
Wanneer je Windows PowerShell-provider geregistreerd is bij Windows PowerShell, kun je dit testen door de ondersteunde cmdlets op de commandoregel uit te voeren, inclusief cmdlets die beschikbaar zijn gemaakt door derivatie. Dit voorbeeld test de voorbeeldnavigatieprovider.
Voer je nieuwe shell uit en gebruik de
Set-Locationcmdlet om het pad in te stellen dat het de Access-database aangeeft.Set-Location mydb:Voer nu de
Get-ChildItemcmdlet uit om een lijst van database-items op te halen, wat de beschikbare databasetabellen zijn. Voor elke tabel haalt deze cmdlet ook het aantal tabelrijen op.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 SuppliersGebruik de
Set-Locationcmdlet opnieuw om de locatie van de Medewerkers-datatabel in te stellen.Set-Location EmployeesLaten we nu de
Get-Locationcmdlet gebruiken om het pad naar de Employees-tabel op te halen.Get-LocationPath ---- mydb:\EmployeesGebruik nu de
Get-ChildItemcmdlet die naar deFormat-Tablecmdlet is geleid. Deze set cmdlets haalt de items op voor de Employees-datatabel, dat zijn de tabelrijen. Ze zijn geformatteerd zoals gespecificeerd door deFormat-Tablecmdlet.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.DataRowJe kunt nu de
Get-Itemcmdlet uitvoeren om de items voor rij 0 van de Employees datatabel op te halen.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 : 0Gebruik de
Get-Itemcmdlet opnieuw om de medewerkersgegevens van de items in rij 0 op te halen.(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
Zie ook
Het aanmaken van Windows PowerShell-providers
Design Your Windows PowerShell provider
Uitbreiden van objecttypes en opmaak
Implementeer een Container Windows PowerShell-provider
Hoe registreer je cmdlets, providers en hostapplicaties