Een Windows PowerShell-containerprovider maken
In dit onderwerp wordt beschreven hoe u een Windows PowerShell-provider maakt die kan werken in gegevensopslag met meerdere lagen. Voor dit type gegevensopslag bevat het hoogste niveau van de winkel de hoofditems en wordt elk volgend niveau een knooppunt van onderliggende items genoemd. Door de gebruiker toe te staan op deze onderliggende knooppunten te werken, kan een gebruiker hiërarchisch communiceren via het gegevensopslag.
Providers die kunnen werken op gegevensopslag op meerdere niveau worden aangeduid als Windows PowerShell containerproviders. Let er echter op dat een Windows PowerShell containerprovider alleen kan worden gebruikt wanneer er één container (geen geneste containers) met items in staat. Als er geneste containers zijn, moet u een Windows PowerShell implementeren. Zie Creating a Windows PowerShell Navigation Provider (Een Windows PowerShell navigatieprovider) voor meer informatie over het Windows PowerShell van een navigatieprovider.
Notitie
U kunt het C#-bronbestand (AccessDBSampleProvider04.cs) voor deze provider downloaden met behulp van de Microsoft Windows Software Development Kit voor Windows Vista en .NET Framework 3.0 Runtime Components. Zie How to Install Windows PowerShell and Download the Windows PowerShell SDK voor downloadinstructies. De gedownloade bronbestanden zijn beschikbaar in de <PowerShell Samples> map . Zie Uw Windows PowerShell provider ontwerpen voor meer informatie over andere implementaties van Windows PowerShell-provider.
De Windows PowerShell containerprovider die hier wordt beschreven, definieert de database als één container, met de tabellen en rijen van de database gedefinieerd als items van de container.
Waarschuwing
In dit ontwerp wordt ervan uitgenomen dat er een database is met een veld met de naam-id en dat het type van het veld LongInteger is.
Een containerproviderklasse Windows PowerShell definiëren
Een Windows PowerShell containerprovider moet een .NET-klasse definiëren die is afgeleid van de basisklasse System.Management.Automation.Provider.Containercmdletprovider. Hier is de klassedefinitie voor de Windows PowerShell containerprovider die in deze sectie wordt beschreven.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
U ziet dat in deze klassedefinitie het kenmerk System.Management.Automation.Provider.Cmdletproviderattribute twee parameters bevat. De eerste parameter geeft een gebruiksvriendelijke naam op voor de provider die wordt gebruikt door Windows PowerShell. De tweede parameter geeft de Windows PowerShell specifieke mogelijkheden die de provider voor de Windows PowerShell tijdens de verwerking van de opdracht. Voor deze provider zijn er geen Windows PowerShell specifieke mogelijkheden die worden toegevoegd.
Basisfunctionaliteit definiëren
Zoals beschreven in Uw Windows PowerShell-providerontwerpen, is de klasse System.Management.Automation.Provider.Containercmdletprovider afgeleid van verschillende andere klassen die verschillende providerfunctionaliteit bieden. Een Windows PowerShell containerprovider moet daarom alle functionaliteit definiëren die door deze klassen wordt geboden.
Zie Creating a Basic Windows PowerShell Provider voor het implementeren van functionaliteit voor het toevoegen van sessiespecifieke initialisatiegegevens envoor het vrijgeven van resources die worden gebruikt door de provider. De meeste providers (inclusief de provider die hier wordt beschreven) kunnen echter gebruikmaken van de standaard implementatie van deze functionaliteit die wordt geleverd door Windows PowerShell.
Om toegang te krijgen tot het gegevensopslag, moet de provider de methoden van de basisklasse System.Management.Automation.Provider.Drivecmdletprovider implementeren. Zie voor meer informatie over het implementeren van deze methoden maken van een Windows PowerShell Station Provider.
Als u de items van een gegevensopslag wilt bewerken, zoals het verkrijgen, instellen en wissen van items, moet de provider de methoden implementeren die worden geleverd door de basisklasse System.Management.Automation.Provider.Itemcmdletprovider. Zie Creating an Windows PowerShell Item Provider (Een provider voor Windows PowerShell maken) voor meer informatie over het implementeren van deze methoden.
Onderliggende items ophalen
Als u een onderliggend item wilt ophalen, moet de Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* overschrijven om aanroepen van de Get-ChildItem
cmdlet te ondersteunen. Met deze methode worden onderliggende items opgehaald uit het gegevensopslag en als objecten naar de pijplijn schrijft. Als de parameter van de cmdlet is opgegeven, worden met de methode alle kinderen opgehaald, recurse
ongeacht het niveau waarop ze zich in. Als de recurse
parameter niet is opgegeven, haalt de methode slechts één niveau van kinderen op.
Hier is de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* voor deze provider. U ziet dat met deze methode de onderliggende items in alle databasetabellen worden opgehaald wanneer het pad de Access-database aangeeft, en dat de onderliggende items worden opgehaald uit de rijen van die tabel als het pad een gegevenstabel aangeeft.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
Dingen die u moet onthouden over het implementeren van GetChildItems
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:
Bij het definiëren van de providerklasse kan een Windows PowerShell-containerprovider providermogelijkheden van ExpandWildcards, Filter, Include of Exclude declareereren in de system.Management.Automation.Provider.Providercaperabilities-enumeration. In dergelijke gevallen moet de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* ervoor zorgen dat het pad dat wordt doorgegeven aan de methode voldoet aan de vereisten van de opgegeven mogelijkheden. Hiervoor moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschappen System.Management.Automation.Provider.Cmdletprovider.Exclude* en System.Management.Automation.Provider.Cmdletprovider.Include*.
Bij de implementatie van deze methode moet rekening worden gehouden met elke vorm van toegang tot het item die het item zichtbaar kan maken voor de gebruiker. Als een gebruiker bijvoorbeeld schrijftoegang heeft tot een bestand via de FileSystem-provider (geleverd door Windows PowerShell), maar geen leestoegang heeft, wordt het bestand nog steeds gebruikt en wordt door System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* als retourneert.
true
Voor uw implementatie moet mogelijk een bovenliggend item worden gecontroleerd om te zien of het onderliggende item kan worden geïndeereerd.Wanneer u meerdere items schrijft, kan de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* enige tijd duren. U kunt uw provider ontwerpen om de items één voor één te schrijven met behulp van de methode System.Management.Automation.Provider.Cmdletprovider.Writeitemobject*. Met deze techniek worden de items in een stroom aan de gebruiker presenteren.
Uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* is verantwoordelijk voor het voorkomen van oneindige recursie wanneer er cirkelvormige koppelingen zijn, zoals . Er moet een geschikte uitzondering voor het beëindigen worden weergegeven om een dergelijke voorwaarde weer te geven.
Dynamische parameters koppelen aan de Get-ChildItem cmdlet
Soms zijn voor Get-ChildItem
de cmdlet die System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* aanroept, aanvullende parameters vereist die tijdens runtime dynamisch worden opgegeven. Om deze dynamische parameters op te geven, moet Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditemsdynamicparameters* implementeren. Deze methode haalt dynamische parameters op voor het item op het aangegeven pad en retourneert een object met eigenschappen en velden met parseerkenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object. De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Get-ChildItem
cmdlet .
Deze Windows PowerShell containerprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.
Namen van onderliggende items ophalen
Als u de namen van onderliggende items wilt ophalen, moet de Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* overschrijven om aanroepen van de cmdlet te ondersteunen wanneer de Get-ChildItem
parameter wordt Name
opgegeven. Met deze methode worden de namen opgehaald van de onderliggende items voor het opgegeven pad of de namen van onderliggende items voor alle containers als de parameter van de returnAllContainers
cmdlet is opgegeven. Een onderliggende naam is het bladgedeelte van een pad. De onderliggende naam voor het pad c:\windows\system32\abc.dll is bijvoorbeeld 'abc.dll'. De onderliggende naam voor de map c:\windows\system32 is system32.
Hier is de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* voor deze provider. U ziet dat met de methode tabelnamen worden opgehaald als het opgegeven pad de Access-database (station) en rijnummers aangeeft als het pad een tabel aangeeft.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
Dingen die u moet onthouden over het implementeren van GetChildNames
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Getchilditems*:
Bij het definiëren van de providerklasse kan een Windows PowerShell-containerprovider providermogelijkheden van ExpandWildcards, Filter, Include of Exclude declareereren in de system.Management.Automation.Provider.Providercaperabilities-enumeration. In dergelijke gevallen moet de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* ervoor zorgen dat het pad dat wordt doorgegeven aan de methode voldoet aan de vereisten van de opgegeven mogelijkheden. Hiervoor moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschappen System.Management.Automation.Provider.Cmdletprovider.Exclude* en System.Management.Automation.Provider.Cmdletprovider.Include*.
Notitie
Een uitzondering op deze regel treedt op wanneer
returnAllContainers
de parameter van de cmdlet is opgegeven. In dit geval moet de methode een onderliggende naam voor een container ophalen, zelfs als deze niet overeen komt met de waarden van de eigenschappen System.Management.Automation.Provider.Cmdletprovider.Filter*, System.Management.Automation.Provider.Cmdletprovider.Include*of System.Management.Automation.Provider.Cmdletprovider.Exclude*.Standaard mogen overschrijvingen van deze methode geen namen ophalen van objecten die over het algemeen verborgen zijn voor de gebruiker, tenzij de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* is opgegeven. Als het opgegeven pad een container aangeeft, is de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* niet vereist.
Uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Getchildnames* is verantwoordelijk voor het voorkomen van oneindige recursie wanneer er cirkelvormige koppelingen zijn, zoals . Er moet een geschikte uitzondering voor het beëindigen worden weergegeven om een dergelijke voorwaarde weer te geven.
Dynamische parameters koppelen aan de Get-ChildItem cmdlet (naam)
Soms vereist Get-ChildItem
de cmdlet (met de Name
parameter) extra parameters die dynamisch zijn opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Getchildnamesdynamicparameters* implementeren. Deze methode haalt de dynamische parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object. De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Get-ChildItem
cmdlet .
Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.
De naam van items wijzigen
Als u de naam van een item wilt wijzigen, moet een Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Renameitem* overschrijven om aanroepen van de Rename-Item
cmdlet te ondersteunen. Met deze methode wordt de naam van het item op het opgegeven pad gewijzigd in de opgegeven nieuwe naam. De nieuwe naam moet altijd relatief zijn ten opzichte van het bovenliggende item (container).
Deze provider overschrijven niet de methode System.Management.Automation.Provider.Containercmdletprovider.Renameitem*. Het volgende is echter de standaard implementatie.
Dingen die u moet onthouden over het implementeren van RenameItem
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Renameitem*:
Bij het definiëren van de providerklasse kan een Windows PowerShell-containerprovider providermogelijkheden van ExpandWildcards, Filter, Include of Exclude declareereren in de system.Management.Automation.Provider.Providercaperabilities-enumeration. In dergelijke gevallen moet de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* ervoor zorgen dat het pad dat wordt doorgegeven aan de methode voldoet aan de vereisten van de opgegeven mogelijkheden. Hiervoor moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschappen System.Management.Automation.Provider.Cmdletprovider.Exclude* en System.Management.Automation.Provider.Cmdletprovider.Include*.
De methode System.Management.Automation.Provider.Containercmdletprovider.Renameitem* is alleen bedoeld voor het wijzigen van de naam van een item en niet voor verplaatsbewerkingen. Uw implementatie van de methode moet een fout schrijven als de parameter padscheidingstekens bevat, of als dit ertoe kan leiden dat het item de
newName
bovenliggende locatie wijzigt.Standaard mogen overschrijvingen van deze methode de naam van objecten niet wijzigen, tenzij de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* is opgegeven. Als het opgegeven pad een container aangeeft, is de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* niet vereist.
Uw implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Renameitem* moet System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aanroepen en de retourwaarde controleren voordat u wijzigingen aan het gegevensopslag aanlevert. Deze methode wordt gebruikt om de uitvoering van een bewerking te bevestigen wanneer een wijziging wordt aangebracht in de systeemtoestand, bijvoorbeeld het wijzigen van de naam van bestanden. System.Management.Automation.Provider.Cmdletprovider.ShouldProcess verzendt de naam van de resource die aan de gebruiker moet worden gewijzigd, waarbij de Windows PowerShell-runtime rekening houdt met opdrachtregelinstellingen of voorkeursvariabelen om te bepalen wat er moet worden weergegeven.
Nadat de aanroep van System.Management.Automation.Provider.Cmdletprovider.ShouldProcess is retourneert, moet de methode
true
System.Management.Automation.Provider.Containercmdletprovider.Renameitem* de methode System.Management.Automation.Provider.Cmdletprovider.ShouldContinue aanroepen. Met deze methode wordt een bevestigingsbericht naar de gebruiker gestuurd om aanvullende feedback toe te staan om te laten weten of de bewerking moet worden voortgezet. Een provider moet System.Management.Automation.Provider.Cmdletprovider.ShouldContinue aanroepen als een extra controle op mogelijk gevaarlijke systeemwijzigingen.
Dynamische parameters koppelen aan de Rename-Item cmdlet
Soms vereist Rename-Item
de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Als u deze dynamische parameters wilt opgeven, Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Renameitemdynamicparameters* implementeren. Deze methode haalt de parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object. De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Rename-Item
cmdlet .
Deze containerprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.
Nieuwe items maken
Als u nieuwe items wilt maken, moet een containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* implementeren om aanroepen van de New-Item
cmdlet te ondersteunen. Met deze methode maakt u een gegevensitem dat zich op het opgegeven pad bevindt. De type
parameter van de cmdlet bevat het door de provider gedefinieerde type voor het nieuwe item. De FileSystem-provider gebruikt bijvoorbeeld een type
parameter met de waarde 'bestand' of 'map'. De newItemValue
parameter van de cmdlet geeft een providerspecifieke waarde op voor het nieuwe item.
Hier is de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* voor deze provider.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
Dingen om te onthouden over het implementeren van NewItem
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Newitem*:
De methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* moet een niet-casegevoelige vergelijking uitvoeren van de tekenreeks die is doorgegeven in de
type
parameter . Er moeten ook minst dubbelzinnige overeenkomsten mogelijk zijn. Voor de typen 'bestand' en 'map' is bijvoorbeeld alleen de eerste letter vereist om ondubbelzinnig te zijn. Als de parameter aangeeft dat een type dat uw provider niet kan maken, moet de methodetype
System.Management.Automation.Provider.Containercmdletprovider.Newitem* een ArgumentException schrijven met een bericht dat aangeeft welke typen de provider kan maken.Voor de parameter wordt de implementatie van de methode
newItemValue
System.Management.Automation.Provider.Containercmdletprovider.Newitem* aanbevolen om tekenreeksen minimaal te accepteren. Het moet ook het type object accepteren dat voor hetzelfde pad wordt opgehaald door de methode System.Management.Automation.Provider.Itemcmdletprovider.Getitem*. De methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* kan de methode System.Management.Automation.Languageprimitives.Convertto* gebruiken om typen te converteren naar het gewenste type.Uw implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* moet System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aanroepen en de retourwaarde controleren voordat u wijzigingen aan het gegevensopslag aanlevert. Nadat de aanroep van System.Management.Automation.Provider.Cmdletprovider.ShouldProcess true retourneert, moet de methode System.Management.Automation.Provider.Containercmdletprovider.Newitem* de methode System.Management.Automation.Provider.Cmdletprovider.ShouldContinue aanroepen als een extra controle op mogelijk gevaarlijke systeemwijzigingen.
Dynamische parameters koppelen aan de New-Item cmdlet
Soms vereist New-Item
de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet de containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Newitemdynamicparameters* implementeren. Deze methode haalt de parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object. De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de New-Item
cmdlet .
Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van deze methode.
Items verwijderen
Als u items wilt verwijderen, moet de Windows PowerShell-provider de methode System.Management.Automation.Provider.Containercmdletprovider.Removeitem* overschrijven om aanroepen van de Remove-Item
cmdlet te ondersteunen. Met deze methode verwijdert u een item uit het gegevensopslag op het opgegeven pad. Als de parameter van de cmdlet is ingesteld op , verwijdert de methode alle onderliggende recurse
Remove-Item
true
items, ongeacht hun niveau. Als de parameter is ingesteld op , verwijdert de methode slechts false
één item op het opgegeven pad.
Deze provider biedt geen ondersteuning voor het verwijderen van items. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.Containercmdletprovider.Removeitem*.
Dingen om te onthouden over het implementeren van RemoveItem
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Newitem*:
Bij het definiëren van de providerklasse kan een Windows PowerShell-containerprovider providermogelijkheden van ExpandWildcards, Filter, Include of Exclude declareer in de system.Management.Automation.Provider.Providercaperation. In dergelijke gevallen moet de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* ervoor zorgen dat het pad dat wordt doorgegeven aan de methode voldoet aan de vereisten van de opgegeven mogelijkheden. Hiervoor moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschappen System.Management.Automation.Provider.Cmdletprovider.Exclude* en System.Management.Automation.Provider.Cmdletprovider.Include*.
Standaard mogen met overschrijvingen van deze methode geen objecten worden verwijderd, tenzij de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* is ingesteld op true. Als het opgegeven pad een container aangeeft, is de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* niet vereist.
Uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Removeitem* is verantwoordelijk voor het voorkomen van oneindige recursie wanneer er cirkelvormige koppelingen zijn, zoals . Er moet een geschikte beëindigings uitzondering worden gemaakt om een dergelijke voorwaarde weer te geven.
Uw implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Removeitem* moet System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aanroepen en de retourwaarde controleren voordat u wijzigingen aan het gegevensopslag aanwijst. Nadat de aanroep van System.Management.Automation.Provider.Cmdletprovider.ShouldProcess is retourneert, moet de methode
true
System.Management.Automation.Provider.Containercmdletprovider.Removeitem* de methode System.Management.Automation.Provider.Cmdletprovider.ShouldContinue aanroepen als een extra controle op mogelijk gevaarlijke systeemwijzigingen.
Dynamische parameters koppelen aan de Remove-Item cmdlet
Soms vereist Remove-Item
de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet de containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters* implementeren om deze parameters te verwerken. Deze methode haalt de dynamische parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object. De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Remove-Item
cmdlet .
Deze containerprovider implementeert deze methode niet. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.Containercmdletprovider.Removeitemdynamicparameters*.
Query's uitvoeren op onderliggende items
Als u wilt controleren of er onderliggende items bestaan op het opgegeven pad, moet de Windows PowerShell-containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* overschrijven. Deze methode retourneert true
als het item children heeft, en false
anders. Voor een null- of leeg pad beschouwt de methode alle items in het gegevensopslag als children en retourneert true
.
Hier is de overschrijvingen voor de methode System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*. Als er meer dan twee padonderdelen zijn gemaakt met de Help-methode ChunkPath, retourneert de methode , omdat alleen een databasecontainer en een false
tabelcontainer zijn gedefinieerd. Zie De ChunkPath-methode wordt besproken in Creating a Windows PowerShell Item Provider (Een service-itemprovider maken) voor meer informatie over deze helpermethode.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Dingen om te onthouden over het implementeren van HasChildItems
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.Containercmdletprovider.Haschilditems*:
- Als de containerprovider een hoofdmap toont die interessante bevestigingspunten bevat, moet de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Haschilditems* worden geretourneerd wanneer een null- of lege tekenreeks wordt doorgegeven voor
true
het pad.
Items kopiëren
Als u items wilt kopiëren, moet de containerprovider de methode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem implementeren om aanroepen van de Copy-Item
cmdlet te ondersteunen. Met deze methode wordt een gegevensitem gekopieerd van de locatie die wordt aangegeven door de parameter van de cmdlet naar de path
locatie die wordt aangegeven door de parameter copyPath
. Als de recurse
parameter is opgegeven, kopieert de methode alle subcontainers. Als de parameter niet is opgegeven, kopieert de methode slechts één niveau van items.
Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Dingen om te onthouden over het implementeren van CopyItem
De volgende voorwaarden kunnen van toepassing zijn op uw implementatie van System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Bij het definiëren van de providerklasse kan een Windows PowerShell-containerprovider providermogelijkheden van ExpandWildcards, Filter, Include of Exclude declareer in de system.Management.Automation.Provider.Providercaperation. In dergelijke gevallen moet de implementatie van de methode System.Management.Automation.Provider.Containercmdletprovider.Getchilditems* ervoor zorgen dat het pad dat wordt doorgegeven aan de methode voldoet aan de vereisten van de opgegeven mogelijkheden. Hiervoor moet de methode toegang hebben tot de juiste eigenschap, bijvoorbeeld de eigenschappen System.Management.Automation.Provider.Cmdletprovider.Exclude* en System.Management.Automation.Provider.Cmdletprovider.Include*.
Standaard mogen met overschrijvingen van deze methode geen objecten worden overgenomen van bestaande objecten, tenzij de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* is ingesteld op
true
. De bestandssysteemprovider kopieert c:\temp\abc.txt bijvoorbeeld niet via een bestaand c:\abc.txt-bestand, tenzij de eigenschap System.Management.Automation.Provider.Cmdletprovider.Force* is ingesteld optrue
. Als het pad dat is opgegeven in de parameter bestaat en een container aangeeft, is de eigenschapcopyPath
System.Management.Automation.Provider.Cmdletprovider.Force* niet vereist. In dit geval moet System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem het item dat wordt aangegeven door de parameter kopiëren naar de container die wordt aangegeven door de parameter alspath
copyPath
onderliggend item.Uw implementatie van System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem is verantwoordelijk voor het voorkomen van oneindige recursie wanneer er cirkelvormige koppelingen zijn, zoals . Er moet een geschikte beëindigings uitzondering worden gemaakt om een dergelijke voorwaarde weer te geven.
Uw implementatie van de methode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem moet System.Management.Automation.Provider.Cmdletprovider.ShouldProcess aanroepen en de retourwaarde controleren voordat u wijzigingen aan het gegevensopslag aanlevert. Nadat de aanroep van System.Management.Automation.Provider.Cmdletprovider.ShouldProcess true retourneert, moet de methode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem de methode System.Management.Automation.Provider.Cmdletprovider.ShouldContinue aanroepen als een extra controle op mogelijk gevaarlijke systeemwijzigingen. Zie Naam van items wijzigen voor meer informatie over het aanroepen van deze methoden.
Dynamische parameters koppelen aan de Copy-Item cmdlet
Soms vereist Copy-Item
de cmdlet aanvullende parameters die dynamisch worden opgegeven tijdens runtime. Om deze dynamische parameters op te geven, moet de Windows PowerShell containerprovider de methode System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters* implementeren om deze parameters te verwerken. Deze methode haalt de parameters voor het item op het aangegeven pad op en retourneert een object met eigenschappen en velden met parseerkenmerken die vergelijkbaar zijn met een cmdlet-klasse of een System.Management.Automation.Runtimedefinedparameterdictionary-object. De Windows PowerShell runtime gebruikt het geretourneerde object om de parameters toe te voegen aan de Copy-Item
cmdlet .
Deze provider implementeert deze methode niet. De volgende code is echter de standaard implementatie van System.Management.Automation.Provider.Containercmdletprovider.Copyitemdynamicparameters*.
Codevoorbeeld
Zie AccessDbProviderSample04-codevoorbeeld voor de volledige voorbeeldcode.
De Windows PowerShell-provider bouwen
Zie Cmdlets, providers en hosttoepassingen registreren.
De Windows PowerShell-provider testen
Wanneer uw Windows PowerShell-provider is geregistreerd bij Windows PowerShell, kunt u deze testen door de ondersteunde cmdlets uit te voeren op de opdrachtregel. In de volgende voorbeelduitvoer wordt een fictieve Access-database gebruikt.
Voer de
Get-ChildItem
cmdlet uit om de lijst met onderliggende items op te halen uit een tabel Klanten in de Access-database.Get-ChildItem mydb:customers
De volgende uitvoer wordt weergegeven.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :
Voer de
Get-ChildItem
cmdlet opnieuw uit om de gegevens van een tabel op te halen.(Get-ChildItem mydb:customers).data
De volgende uitvoer wordt weergegeven.
TABLE_CAT : c:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :
Gebruik nu de
Get-Item
cmdlet om de items op rij 0 in de gegevenstabel op te halen.Get-Item mydb:\customers\0
De volgende uitvoer wordt weergegeven.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0
Gebruik
Get-Item
opnieuw om de gegevens voor de items in rij 0 op te halen.(Get-Item mydb:\customers\0).data
De volgende uitvoer wordt weergegeven.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101
Gebruik nu de
New-Item
cmdlet om een rij toe te voegen aan een bestaande tabel. De parameter geeft het volledige pad naar de rij aan en moet een rijnummer aangeven dat groter is dan het bestaande aantal rijenPath
in de tabel. DeType
parameter geeft 'rij' aan om dat type item op te geven dat moet worden toevoegen. Ten slotte geeft de parameter een door komma's scheidingstekens lijst metValue
kolomwaarden voor de rij op.New-Item -Path mydb:\Customers\3 -ItemType "row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"
Controleer als volgt de juistheid van de nieuwe itembewerking.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).data
De volgende uitvoer wordt weergegeven.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
Zie ook
Windows PowerShell-providers maken
Uw Windows PowerShell-provider ontwerpen
Een itemprovider Windows PowerShell implementeren
Een navigatieprovider Windows PowerShell implementeren
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor