Not
Å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.
Detta ämne beskriver hur man skapar en Windows PowerShell-leverantör som kan arbeta med flerskiktsdatabaser. För denna typ av datalagring innehåller den övre nivån i lagret rotobjekten och varje efterföljande nivå kallas en nod av barnobjekt. Genom att låta användaren arbeta på dessa barnnoder kan användaren interagera hierarkiskt genom datalagret.
Leverantörer som kan arbeta med flernivådatalagringar kallas Windows PowerShell-containerleverantörer. Var dock medveten om att en Windows PowerShell-containerleverantör endast kan användas när det finns en container (inga nästlade containrar) med objekt i. Om det finns nästlade containrar måste du implementera en Windows PowerShell-navigationsleverantör. För mer information om implementering av Windows PowerShell-navigationsleverantör, se Skapa en Windows PowerShell-navigationsleverantör.
Anmärkning
Du kan ladda ner C#-källfilen (AccessDBSampleProvider04.cs) för denna leverantör med Microsoft Windows Software Development Kit för Windows Vista och .NET Framework 3.0 Runtime Components. För nedladdningsinstruktioner, se Hur man installerar Windows PowerShell och laddar ner Windows PowerShell SDK. De nedladdade källfilerna finns tillgängliga i <PowerShell Samples-katalogen> . För mer information om andra implementeringar av Windows PowerShell-leverantörer, se Designing Your Windows PowerShell Provider.
Windows PowerShell-containerleverantören som beskrivs här definierar databasen som sin enda container, där tabellerna och raderna i databasen definieras som objekt i containern.
Försiktighet
Var medveten om att denna design förutsätter en databas som har ett fält med namn-ID, och att fältets typ är LongInteger.
Definiera en Windows PowerShell Container Provider-klass
En Windows PowerShell-containerleverantör måste definiera en .NET-klass som härstammar från basklassen System.Management.Automation.Provider.ContainerCmdletProvider . Här är klassdefinitionen för Windows PowerShell-containerleverantören som beskrivs i detta avsnitt.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Observera att i denna klassdefinition innehåller attributet System.Management.Automation.Provider.CmdletProviderAttribute två parametrar. Den första parametern specificerar ett användarvänligt namn för leverantören som används av Windows PowerShell. Den andra parametern specificerar de Windows PowerShell-specifika funktioner som leverantören exponerar för Windows PowerShell-runtime under kommandobearbetningen. För denna leverantör finns inga Windows PowerShell-specifika funktioner som lagts till.
Definiera basfunktionalitet
Som beskrivs i Designing Your Windows PowerShell Provider härstammar klassen System.Management.Automation.Provider.ContainerCmdletProvider från flera andra klasser som erbjöd olika leverantörsfunktionalitet. En Windows PowerShell-containerleverantör måste därför definiera all funktionalitet som tillhandahålls av dessa klasser.
För att implementera funktionalitet för att lägga till sessionsspecifik initialiseringsinformation och för att släppa resurser som används av leverantören, se Skapa en grundläggande Windows PowerShell-leverantör. De flesta leverantörer (inklusive den som beskrivs här) kan dock använda standardimplementeringen av denna funktionalitet som tillhandahålls av Windows PowerShell.
För att få tillgång till datalagret måste leverantören implementera metoderna i Basklassen System.Management.Automation.Provider.DriveCmdletProvider . För mer information om hur man implementerar dessa metoder, se Skapa en Windows PowerShell Drive Provider.
För att manipulera objekten i en datalagring, såsom att hämta, sätta och rensa objekt, måste leverantören implementera metoderna som tillhandahålls av Basklassen System.Management.Automation.Provider.ItemCmdletProvider . För mer information om hur man implementerar dessa metoder, se Skapa en Windows PowerShell Item Provider.
Hämta barnföremål
För att hämta ett barnobjekt måste Windows PowerShell-containerleverantören åsidosätta System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* för att stödja anrop från Get-ChildItem cmdleten. Denna metod hämtar barnobjekt från datalagringen och skriver dem till pipelinen som objekt. Om parametern recurse för cmdleten specificeras, hämtar metoden alla barn oavsett vilken nivå de befinner sig på. Om parametern recurse inte specificeras, hämtar metoden endast en enda nivå av barn.
Här är implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* för denna leverantör. Observera att denna metod hämtar barnobjekten i alla databastabeller när vägen anger Access-databasen, och hämtar barnelementen från raderna i den tabellen om sökvägen indikerar en datatabell.
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
Saker att komma ihåg när man implementerar GetChildItems
Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
När leverantörsklassen definieras kan en Windows PowerShell-containerleverantör deklarera leverantörsförmågorna ExpandWildcards, Filter, Include eller Exkluder, från System.Management.Automation.Provider.ProviderCapabilities-enumerationen . I dessa fall måste implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* säkerställa att vägen som skickas till metoden uppfyller kraven för de specificerade kapabiliteterna. För att göra detta bör metoden komma åt rätt egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude* och System.Management.Automation.Provider.CmdletProvider.Include* .
Implementeringen av denna metod bör ta hänsyn till alla former av åtkomst till objektet som kan göra objektet synligt för användaren. Till exempel, om en användare har skrivbehörighet till en fil via FileSystem-leverantören (tillhandahållen av Windows PowerShell), men inte läsbehörighet, finns filen fortfarande kvar och System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* returnerar
true. Din implementation kan kräva att du kontrollerar ett föräldraobjekt för att se om barnet kan enumereras.När man skriver flera objekt kan metoden System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* ta viss tid. Du kan designa din leverantör att skriva objekten med metoden System.Management.Automation.Provider.CmdletProvider.WriteItemObject* , en i taget. Genom att använda denna teknik presenteras objekten för användaren i en ström.
Din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* ansvarar för att förhindra oändlig rekursion när det finns cirkulära länkar och liknande. Ett lämpligt avslutande undantag bör införas för att återspegla ett sådant tillstånd.
Att fästa dynamiska parametrar till Get-ChildItem cmdleten
Ibland kräver cmdleten som anropar Get-ChildItemSystem.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-containerleverantören implementera metoden System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters* . Denna metod hämtar dynamiska parametrar för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsingattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Get-ChildItem cmdleten.
Denna Windows PowerShell-containerleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.
Hämta namn på barnobjekt
För att hämta namnen på barnobjekt måste Windows PowerShell-containerleverantören åsidosätta System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames för att stödja anrop från cmdleten Get-ChildItem när dess Name parameter specificeras. Denna metod hämtar namnen på barnobjekten för den angivna sökvägen eller barn-objektnamn för alla behållare om parametern returnAllContainers för cmdleten är specificerad. Ett barnnamn är bladdelen av en stig. Till exempel är barnnamnet för sökvägen C:\windows\system32\abc.dll "abc.dll". Barnnamnet för katalogen C:\windows\system32 är "system32".
Här är implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* för denna leverantör. Observera att metoden hämtar tabellnamn om den angivna sökvägen anger Access-databasen (disken) och radnummer om vägen anger en tabell.
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
Saker att komma ihåg när du implementerar GetChildNames
Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
När leverantörsklassen definieras kan en Windows PowerShell-containerleverantör deklarera leverantörsförmågorna ExpandWildcards, Filter, Include eller Exkluder, från System.Management.Automation.Provider.ProviderCapabilities-enumerationen . I dessa fall måste implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* säkerställa att vägen som skickas till metoden uppfyller kraven för de specificerade kapabiliteterna. För att göra detta bör metoden komma åt rätt egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude* och System.Management.Automation.Provider.CmdletProvider.Include* .
Anmärkning
Ett undantag från denna regel uppstår när parametern
returnAllContainersför cmdleten specificeras. I detta fall bör metoden hämta vilket barnnamn som helst för en container, även om det inte matchar värdena för System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include* eller System.Management.Automation.Provider.CmdletProvider.Exclude* -egenskaper.Som standard bör överskrivningar av denna metod inte hämta namn på objekt som vanligtvis är dolda för användaren om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är specificerad. Om den angivna vägen indikerar en container krävs inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* .
Din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* ansvarar för att förhindra oändlig rekursion när det finns cirkulära länkar och liknande. Ett lämpligt avslutande undantag bör införas för att återspegla ett sådant tillstånd.
Att fästa dynamiska parametrar till Get-ChildItem cmdlet (namn)
Ibland kräver cmdleten Get-ChildItem (med parametern Name ) ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-containerleverantören implementera System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters* -metoden. Denna metod hämtar de dynamiska parametrarna för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Get-ChildItem cmdleten.
Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.
Namnbyte av föremål
För att byta namn på ett objekt måste en Windows PowerShell-containerleverantör åsidosätta metoden System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* för att stödja anrop från Rename-Item cmdleten. Denna metod ändrar namnet på objektet på den angivna vägen till det nya namnet som angavs. Det nya namnet måste alltid vara relativt till föräldraobjektet (containern).
Denna leverantör åsidosätter inte System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* -metoden. Följande är dock standardimplementeringen.
Saker att komma ihåg när du implementerar RenameItem
Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*:
När leverantörsklassen definieras kan en Windows PowerShell-containerleverantör deklarera leverantörsförmågorna ExpandWildcards, Filter, Include eller Exkluder, från System.Management.Automation.Provider.ProviderCapabilities-enumerationen . I dessa fall måste implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* säkerställa att vägen som skickas till metoden uppfyller kraven för de specificerade kapabiliteterna. För att göra detta bör metoden komma åt rätt egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude* och System.Management.Automation.Provider.CmdletProvider.Include* .
System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* är avsedd för att endast ändra namnet på ett objekt, och inte för flyttoperationer. Din implementation av metoden bör skriva ett fel om parametern
newNameinnehåller vägseparatorer, eller annars kan få objektet att ändra sin föräldraplats.Som standard ska överskrivningar av denna metod inte byta namn på objekt om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är specificerad. Om den angivna vägen indikerar en container krävs inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* .
Din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* bör anropa System.Management.Automation.Provider.CmdletProvider.ShouldProcess och kontrollera dess returvärde innan du gör några ändringar i datalagret. Denna metod används för att bekräfta att en operation utförs när en ändring görs i systemtillståndet, till exempel genom att byta namn på filer. System.Management.Automation.Provider.CmdletProvider.ShouldProcess skickar namnet på resursen som ska ändras till användaren, där Windows PowerShell-runtime tar hänsyn till eventuella kommandoradsinställningar eller preferensvariabler vid avgörandet av vad som ska visas.
Efter anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess återvänder
true, bör metoden System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* anropa metoden System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Denna metod skickar ett meddelande, ett bekräftelsemeddelande, till användaren för att ge ytterligare feedback om operationen ska fortsätta. En leverantör bör anropa System.Management.Automation.Provider.CmdletProvider.ShouldContinue som en extra kontroll för potentiellt farliga systemändringar.
Att fästa dynamiska parametrar till Rename-Item cmdleten
Ibland kräver cmdleten Rename-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-containerleverantören implementera System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters* -metoden. Denna metod hämtar parametrarna för objektet på den angivna vägen och returnerar ett objekt som har egenskaper och fält med parsingattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Rename-Item cmdleten.
Denna containerleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.
Skapa nya föremål
För att skapa nya objekt måste en containerleverantör implementera metoden System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* för att stödja anrop från New-Item cmdleten. Denna metod skapar ett dataobjekt som är placerat vid den angivna sökvägen. Parametern type för cmdleten innehåller den leverantörsdefinierade typen för det nya objektet. Till exempel använder Filsystemleverantören en type parameter med värdet "fil" eller "katalog". Parametern newItemValue i cmdleten specificerar ett leverantörsspecifikt värde för det nya objektet.
Här är implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* för denna leverantör.
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];
Saker att komma ihåg när du implementerar NewItem
Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*-metoden bör utföra en mellanlägesoberoende jämförelse av strängen som skickas i parametern
type. Det bör också tillåta minst tvetydiga matchningar. Till exempel, för typerna "fil" och "katalog" krävs endast den första bokstaven för att avgöra betydelse. Om parameterntypeindikerar en typ som din leverantör inte kan skapa, bör metoden System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* skriva en ArgumentException med ett meddelande som anger vilka typer leverantören kan skapa.För parametern
newItemValuerekommenderas implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* -metoden för att minst acceptera strängar. Den bör också acceptera den typ av objekt som hämtas av System.Management.Automation.Provider.ItemCmdletProvider.GetItem* för samma sökväg. System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*-metoden kan använda metoden System.Management.Automation.LanguagePrimitives.ConvertTo* för att konvertera typer till önskad typ.Din implementation av metoden System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* bör anropa System.Management.Automation.Provider.CmdletProvider.ShouldProcess och kontrollera dess returvärde innan du gör några ändringar i datalagret. Efter att anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess återvänder sann, bör metoden System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* anropa metoden System.Management.Automation.Provider.CmdletProvider.ShouldContinue som en extra kontroll för potentiellt farliga systemändringar.
Att fästa dynamiska parametrar till New-Item cmdleten
Ibland kräver cmdleten New-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste containerleverantören implementera metoden System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters* . Denna metod hämtar parametrarna för objektet på den angivna vägen och returnerar ett objekt som har egenskaper och fält med parsingattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i New-Item cmdleten.
Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av denna metod.
Borttagning av föremål
För att ta bort element måste Windows PowerShell-leverantören åsidosätta metoden System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* för att stödja anrop från Remove-Item cmdleten. Denna metod raderar ett objekt från datalagringen på den angivna vägen. Om parametern recurse för cmdleten Remove-Item sätts till true, tar metoden bort alla barnobjekt oavsett deras nivå. Om parametern är satt till false, tar metoden bort endast ett enda element på den angivna vägen.
Denna leverantör stödjer inte borttagning av föremål. Följande kod är dock standardimplementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.
Saker att komma ihåg när man implementerar RemoveItem
Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
När leverantörsklassen definieras kan en Windows PowerShell-containerleverantör deklarera leverantörsförmågorna ExpandWildcards, Filter, Include eller Exkluder, från System.Management.Automation.Provider.ProviderCapabilities-enumerationen . I dessa fall måste implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* säkerställa att vägen som skickas till metoden uppfyller kraven för de specificerade kapabiliteterna. För att göra detta bör metoden komma åt rätt egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude* och System.Management.Automation.Provider.CmdletProvider.Include* .
Som standard bör överskrivningar av denna metod inte ta bort objekt om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är satt till true. Om den angivna vägen indikerar en container krävs inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* .
Din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* ansvarar för att förhindra oändlig rekursion när det finns cirkulära länkar och liknande. Ett lämpligt avslutande undantag bör införas för att återspegla ett sådant tillstånd.
Din implementation av metoden System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* bör anropa System.Management.Automation.Provider.CmdletProvider.ShouldProcess och kontrollera dess returvärde innan du gör några ändringar i datalagret. Efter anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess återvänder
true, bör metoden System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* anropa metoden System.Management.Automation.Provider.CmdletProvider.ShouldContinue som en ytterligare kontroll för potentiellt farliga systemändringar.
Att fästa dynamiska parametrar till Remove-Item cmdleten
Ibland kräver cmdleten Remove-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste containerleverantören implementera metoden System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* för att hantera dessa parametrar. Denna metod hämtar de dynamiska parametrarna för objektet vid den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Remove-Item cmdleten.
Denna containerleverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.
Sökning efter barnobjekt
För att kontrollera om barnobjekt finns på den angivna sökvägen måste Windows PowerShell-containerleverantören åsidosätta System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* -metoden. Denna metod returnerar true om objektet har barn, och false annars. För en null- eller tom väg betraktar metoden alla objekt i datalagringen som barn och returnerar true.
Här är överskrivningen för metoden System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* . Om det finns fler än två vägdelar skapade av ChunkPath-hjälpmetoden, returnerar falsemetoden , eftersom endast en databascontainer och en tabellcontainer är definierade. För mer information om denna hjälpmetod, se ChunkPath-metoden som diskuteras i Creating a Windows PowerShell Item Provider.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Saker att komma ihåg när du implementerar HasChildItems
Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*:
- Om containerleverantören exponerar en rot som innehåller intressanta monteringspunkter, bör implementationen av System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* returnera
truenär en null- eller tom sträng skickas in för vägen.
Kopiering av föremål
För att kopiera objekt måste containerleverantören implementera metoden System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem för att stödja anrop från Copy-Item cmdleten. Denna metod kopierar ett dataobjekt från platsen som anges av path cmdlet-parametern till platsen som parametern copyPath angav. Om parametern recurse anges kopierar metoden alla delbehållare. Om parametern inte anges kopierar metoden endast en enda nivå av objekt.
Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Saker att komma ihåg när man implementerar CopyItem
Följande villkor kan gälla för din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
När leverantörsklassen definieras kan en Windows PowerShell-containerleverantör deklarera leverantörsförmågorna ExpandWildcards, Filter, Include eller Exkluder, från System.Management.Automation.Provider.ProviderCapabilities-enumerationen . I dessa fall måste implementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* säkerställa att vägen som skickas till metoden uppfyller kraven för de specificerade kapabiliteterna. För att göra detta bör metoden komma åt rätt egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude* och System.Management.Automation.Provider.CmdletProvider.Include* .
Som standard ska överskrivningar av denna metod inte kopiera objekt över befintliga objekt om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är satt till
true. Till exempel kommer FileSystem-leverantören inte att kopiera C:\temp\abc.txt över en befintlig C:\abc.txt-fil om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* är satt tilltrue. Om den väg som anges i parameterncopyPathfinns och indikerar en container, krävs inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force* . I detta fall bör System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem kopiera objektet som anges av parameternpathtill containern som anges avcopyPathparametern som ett barn.Din implementation av System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem ansvarar för att förhindra oändlig rekursion när det finns cirkulära länkar och liknande. Ett lämpligt avslutande undantag bör införas för att återspegla ett sådant tillstånd.
Din implementation av metoden System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem bör anropa System.Management.Automation.Provider.CmdletProvider.ShouldProcess och kontrollera dess returvärde innan du gör några ändringar i datalagret. Efter att anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess återgett sann, bör metoden System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem anropa metoden System.Management.Automation.Provider.CmdletProvider.ShouldContinue som en extra kontroll för potentiellt farliga systemändringar. För mer information om att anropa dessa metoder, se Byt namn på föremål.
Att fästa dynamiska parametrar till Copy-Item cmdleten
Ibland kräver cmdleten Copy-Item ytterligare parametrar som specificeras dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-containerleverantören implementera metoden System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* för att hantera dessa parametrar. Denna metod hämtar parametrarna för objektet på den angivna vägen och returnerar ett objekt som har egenskaper och fält med parsingattribut liknande en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-runtime använder det returnerade objektet för att lägga till parametrarna i Copy-Item cmdleten.
Denna leverantör implementerar inte denna metod. Följande kod är dock standardimplementeringen av System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.
Kodexempel
För komplett exempelkod, se AccessDbProviderSample04 kodexempel.
Bygga Windows PowerShell-leverantören
Se hur du registrerar cmdlets, leverantörer och värdapplikationer.
Testning av Windows PowerShell-leverantören
När din Windows PowerShell-leverantör har registrerats hos Windows PowerShell kan du testa det genom att köra de stödda cmdletarna på kommandoraden. Var medveten om att följande exempelutdata använder en fiktiv Access-databas.
Kör cmdleten
Get-ChildItemför att hämta listan över barnobjekt från en Kunder-tabell i Access-databasen.Get-ChildItem mydb:customersFöljande utdata syns.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :Kör cmdleten
Get-ChildItemigen för att hämta data från en tabell.(Get-ChildItem mydb:customers).DataFöljande utdata syns.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :Använd nu cmdleten
Get-Itemför att hämta objekten på rad 0 i datatabellen.Get-Item mydb:\customers\0Följande utdata syns.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Återanvänd
Get-Itemför att hämta data för objekten i rad 0.(Get-Item mydb:\customers\0).DataFöljande utdata syns.
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-0101Använd nu cmdleten
New-Itemför att lägga till en rad i en befintlig tabell. ParameternPathspecificerar hela vägen till raden och måste ange ett radnummer som är större än det befintliga antalet rader i tabellen. ParameternTypeangerRowatt ange vilken typ av objekt som ska läggas till. Slutligen specificerar parameternValueen kommaavgränsad lista av kolumnvärden för raden.New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"Verifiera att den nya artikeloperationen är korrekt enligt följande.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).DataFöljande utdata syns.
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
Se även
Skapa Windows PowerShell-leverantörer
Designa din Windows PowerShell-leverantör
Implementering av en PowerShell-leverantör för Item Windows
Implementering av en Navigation Windows PowerShell-leverantör
Hur man registrerar cmdlets, leverantörer och värdapplikationer