Skapa en Windows PowerShell objektprovider
I det här avsnittet beskrivs hur du skapar en Windows PowerShell provider som kan manipulera data i ett datalager. I det här avsnittet kallas dataelementen i arkivet för "objekt" i datalagret. Därför kallas en provider som kan manipulera data i arkivet för en Windows PowerShell objektprovider.
Anteckning
Du kan ladda ned C#-källfilen (AccessDBSampleProvider03.cs) för den här providern med hjälp av Microsoft Windows Software Development Kit för Windows Vista och .NET Framework 3.0 Runtime Components. Instruktioner för nedladdning finns i Så här installerar du Windows PowerShell och laddar ned Windows PowerShell SDK.
De nedladdade källfilerna PowerShell Samples är tillgängliga i katalogen . Mer information om andra implementeringar av Windows PowerShell-providern finns i Designing Your Windows PowerShell Provider (Utforma din Windows PowerShell-provider).
Den Windows PowerShell objektprovider som beskrivs i det här avsnittet hämtar data från en Access-databas. I det här fallet är ett "objekt" antingen en tabell i Access-databasen eller en rad i en tabell.
Definiera providerklassen för Windows PowerShell objekt
En Windows PowerShell objektprovider måste definiera en .NET-klass som härleds från basklassen System.Management.Automation.Provider.ItemCmdletProvider. Följande är klassdefinitionen för objektprovidern som beskrivs i det här avsnittet.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ItemCmdletProvider
Observera att attributet System.Management.Automation.Provider.CmdletProviderAttribute i den här klassdefinitionen innehåller två parametrar. Den första parametern anger ett användarvänligt namn för providern som används av Windows PowerShell. Den andra parametern anger Windows PowerShell specifika funktioner som providern exponerar för Windows PowerShell-körningen under kommandobearbetningen. För den här providern finns det inga ytterligare Windows PowerShell specifika funktioner.
Definiera grundläggande funktioner
Enligt beskrivningen i Designa din Windows PowerShell-provider härleds klassen System.Management.Automation.Provider.DriveCmdletProvider från flera andra klasser som tillhandahöll olika providerfunktioner. En Windows PowerShell objektprovider måste därför definiera alla funktioner som tillhandahålls av dessa klasser.
Mer 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 Windows PowerShell-provider. De flesta leverantörer, inklusive leverantören som beskrivs här, kan dock använda standardimplementeringen av den här funktionen som tillhandahålls av Windows PowerShell.
Innan Windows PowerShell objektprovidern kan manipulera objekten i arkivet måste den implementera metoderna i basklassen System.Management.Automation.Provider.DriveCmdletProvider för att få åtkomst till datalagret. Mer information om hur du implementerar den här klassen finns i Skapa en Windows PowerShell-enhetsprovider.
Söka efter sökvägens giltighet
När du letar efter ett dataobjekt tillhandahåller Windows PowerShell-körningen en Windows PowerShell sökväg till providern, enligt definitionen i avsnittet "PSPath-begrepp" i Hur Windows PowerShell fungerar. En Windows PowerShell objektprovider måste verifiera syntaktisk och semantisk giltighet för alla sökvägar som skickas till den genom att implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath. Den här metoden returnerar true om sökvägen är giltig och false annars. Tänk på att implementeringen av den här metoden inte bör verifiera förekomsten av objektet på sökvägen, utan bara att sökvägen är syntaktiskt och semantiskt korrekt.
Här är implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath för den här providern. Observera att den här implementeringen anropar en NormalizePath-hjälpmetod för att konvertera alla avgränsare i sökvägen till en enhetlig.
protected override bool IsValidPath(string path)
{
bool result = true;
// check if the path is null or empty
if (String.IsNullOrEmpty(path))
{
result = false;
}
// convert all separators in the path to a uniform one
path = NormalizePath(path);
// split the path into individual chunks
string[] pathChunks = path.Split(pathSeparator.ToCharArray());
foreach (string pathChunk in pathChunks)
{
if (pathChunk.Length == 0)
{
result = false;
}
}
return result;
} // IsValidPath
Avgöra om ett objekt finns
När du har verifierat sökvägen måste Windows PowerShell-körningen avgöra om det finns ett dataobjekt på den sökvägen. För att stödja den här typen av fråga implementerar Windows PowerShell objektprovidern metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExists. Den här metoden returnerar true att ett objekt hittas på den angivna sökvägen och false (standard) annars.
Här är implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExists för den här providern. Observera att den här metoden anropar hjälpmetoderna PathIsDrive, ChunkPath och GetTable och använder ett providerdefinierat DatabaseTableInfo-objekt .
protected override bool ItemExists(string path)
{
// check if the path represented is a drive
if (PathIsDrive(path))
{
return true;
}
// Obtain type, table name and row number from path
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
DatabaseTableInfo table = GetTable(tableName);
if (type == PathType.Table)
{
// if specified path represents a table then DatabaseTableInfo
// object for the same should exist
if (table != null)
{
return true;
}
}
else if (type == PathType.Row)
{
// if specified path represents a row then DatabaseTableInfo should
// exist for the table and then specified row number must be within
// the maximum row count in the table
if (table != null && rowNumber < table.RowCount)
{
return true;
}
}
return false;
} // ItemExists
Saker att komma ihåg när du implementerar ItemExists
Följande villkor kan gälla för implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:
- När du definierar providerklassen kan en Windows PowerShell objektprovider deklarera providerfunktioner för
ExpandWildcards,Filter,IncludeellerExclude, från uppräkningen System.Management.Automation.Provider.ProviderCapabilities. I dessa fall måste implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExists se till att sökvägen som skickas till metoden uppfyller kraven för de angivna funktionerna. För att göra detta bör metoden komma åt lämplig egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude och System.Management.Automation.Provider.CmdletProvider.Include . - Implementeringen av den här metoden ska hantera alla typer av åtkomst till objektet som kan göra objektet synligt för användaren. Om en användare till exempel har skrivåtkomst till en fil via filsystemsprovidern (tillhandahålls av Windows PowerShell), men inte läsåtkomst, finns filen fortfarande och System.Management.Automation.Provider.ItemCmdletProvider.ItemExists returnerar
true. Implementeringen kan kräva kontroll av ett överordnat objekt för att se om det underordnade objektet kan räknas upp.
Koppla dynamiska parametrar till cmdleten Test-Path
Ibland kräver cmdleten Test-Path som anropar System.Management.Automation.Provider.ItemCmdletProvider.ItemExists ytterligare parametrar som anges dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell objektprovider implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters. Den här metoden hämtar de dynamiska parametrarna för objektet på den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-körningen använder det returnerade objektet för att lägga till parametrarna i cmdletenTest-Path.
Den här Windows PowerShell objektprovidern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.
Hämtar ett objekt
För att hämta ett objekt måste Windows PowerShell objektprovidern åsidosätta metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItem för att stödja anrop från cmdletenGet-Item. Den här metoden skriver objektet med hjälp av metoden System.Management.Automation.Provider.CmdletProvider.WriteItemObject .
Här är implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItem för den här providern. Observera att den här metoden använder hjälpmetoderna GetTable och GetRow för att hämta objekt som antingen är tabeller i Access-databasen eller rader i en datatabell.
protected override void GetItem(string path)
{
// check if the path represented is a drive
if (PathIsDrive(path))
{
WriteItemObject(this.PSDriveInfo, path, true);
return;
}// if (PathIsDrive...
// Get table name and row information from the path and do
// necessary actions
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
DatabaseTableInfo table = GetTable(tableName);
WriteItemObject(table, path, true);
}
else if (type == PathType.Row)
{
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // GetItem
Saker att komma ihåg när du implementerar GetItem
Följande villkor kan gälla för en implementering av System.Management.Automation.Provider.ItemCmdletProvider.GetItem:
När du definierar providerklassen kan en Windows PowerShell objektprovider deklarera providerfunktioner för
ExpandWildcards,Filter,IncludeellerExclude, från uppräkningen System.Management.Automation.Provider.ProviderCapabilities. I dessa fall måste implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.GetItem se till att sökvägen som skickas till metoden uppfyller dessa krav. För att göra detta bör metoden komma åt lämplig egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude och System.Management.Automation.Provider.CmdletProvider.Include .Som standard ska åsidosättningar av den här metoden inte hämta objekt som vanligtvis är dolda för användaren om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force är inställd på
true. Metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItem för FileSystem-providern kontrollerar till exempel egenskapen System.Management.Automation.Provider.CmdletProvider.Force innan den försöker anropa System.Management.Automation.Provider.CmdletProvider.WriteItemObject för dolda filer eller systemfiler.
Koppla dynamiska parametrar till cmdleten Get-Item
Ibland kräver cmdleten Get-Item ytterligare parametrar som anges dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell objektprovider implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters. Den här metoden hämtar de dynamiska parametrarna för objektet på den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-körningen använder det returnerade objektet för att lägga till parametrarna i cmdletenGet-Item.
Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.
Ange ett objekt
Om du vill ange ett objekt måste Windows PowerShell objektprovidern åsidosätta metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem för att stödja anrop från cmdletenSet-Item. Den här metoden anger värdet för objektet på den angivna sökvägen.
Den här providern tillhandahåller ingen åsidosättning för metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Följande är dock standardimplementeringen av den här metoden.
Saker att komma ihåg när du implementerar SetItem
Följande villkor kan gälla för implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.SetItem:
När du definierar providerklassen kan en Windows PowerShell objektprovider deklarera providerfunktioner för
ExpandWildcards,Filter,IncludeellerExclude, från uppräkningen System.Management.Automation.Provider.ProviderCapabilities. I dessa fall måste implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.SetItem se till att sökvägen som skickas till metoden uppfyller dessa krav. För att göra detta bör metoden komma åt lämplig egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude och System.Management.Automation.Provider.CmdletProvider.Include .Som standard ska åsidosättningar av den här metoden inte ange eller skriva objekt som är dolda för användaren om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force är inställd på
true. Ett fel ska skickas till metoden System.Management.Automation.Provider.CmdletProvider.WriteError om sökvägen representerar ett dolt objekt och System.Management.Automation.Provider.CmdletProvider.Force är inställt påfalse.Din implementering av metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem ska anropa System.Management.Automation.Provider.CmdletProvider.ShouldProcess och verifiera 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 datalagret, till exempel när filer tas bort. Metoden System.Management.Automation.Provider.CmdletProvider.ShouldProcess skickar namnet på resursen som ska ändras till användaren, där Windows PowerShell-körningen tar hänsyn till eventuella kommandoradsinställningar eller inställningsvariabler för att avgöra vad som ska visas.
När anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess returnerar
trueska metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem 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 kontrollera om åtgärden ska fortsätta. Anropet till System.Management.Automation.Provider.CmdletProvider.ShouldContinue tillåter ytterligare kontroller av potentiellt farliga systemändringar.
Hämtar dynamiska parametrar för SetItem
Ibland kräver cmdleten Set-Item ytterligare parametrar som anges dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell objektprovider implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters. Den här metoden hämtar de dynamiska parametrarna för objektet på den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-körningen använder det returnerade objektet för att lägga till parametrarna i cmdletenSet-Item.
Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.
Rensa ett objekt
För att rensa ett objekt implementerar Windows PowerShell-objektprovidern metoden System.Management.Automation.Provider.ItemCmdletProvider.ClearItem för att stödja anrop från cmdletenClear-Item. Den här metoden raderar dataobjektet på den angivna sökvägen.
Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.
Saker att komma ihåg när du implementerar ClearItem
Följande villkor kan gälla för en implementering av System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:
När du definierar providerklassen kan en Windows PowerShell objektprovider deklarera providerfunktioner för
ExpandWildcards,Filter,IncludeellerExclude, från uppräkningen System.Management.Automation.Provider.ProviderCapabilities. I dessa fall måste implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.ClearItem se till att sökvägen som skickas till metoden uppfyller dessa krav. För att göra detta bör metoden komma åt lämplig egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude och System.Management.Automation.Provider.CmdletProvider.Include .Som standard bör åsidosättningar av den här metoden inte ange eller skriva objekt som är dolda för användaren om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force är inställd på
true. Ett fel ska skickas till metoden System.Management.Automation.Provider.CmdletProvider.WriteError om sökvägen representerar ett objekt som är dolt för användaren och System.Management.Automation.Provider.CmdletProvider.Force är inställt påfalse.Implementeringen av metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem bör anropa System.Management.Automation.Provider.CmdletProvider.ShouldProcess och verifiera 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 datalagret, till exempel när filer tas bort. Metoden System.Management.Automation.Provider.CmdletProvider.ShouldProcess skickar namnet på resursen som ska ändras till användaren, med Windows PowerShell körning och hanterar alla kommandoradsinställningar eller inställningsvariabler för att avgöra vad som ska visas.
Efter anropet till System.Management.Automation.Provider.CmdletProvider.ShouldProcess returnerar
truebör metoden System.Management.Automation.Provider.ItemCmdletProvider.SetItem 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 kontrollera om åtgärden ska fortsätta. Anropet till System.Management.Automation.Provider.CmdletProvider.ShouldContinue tillåter ytterligare en kontroll av potentiellt farliga systemändringar.
Hämta dynamiska parametrar för ClearItem
Ibland kräver cmdleten Clear-Item ytterligare parametrar som anges dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell-objektprovidern implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters. Den här metoden hämtar de dynamiska parametrarna för objektet på den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-körningen använder det returnerade objektet för att lägga till parametrarna i cmdletenClear-Item.
Den här objektprovidern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.
Utföra en standardåtgärd för ett objekt
En Windows PowerShell objektprovider kan implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction för att stödja anrop från cmdletenInvoke-Item, vilket gör att providern kan utföra en standardåtgärd för objektet på den angivna sökvägen. FileSystem-providern kan till exempel använda den här metoden för att anropa ShellExecute för ett specifikt objekt.
Den här providern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.
Saker att komma ihåg när du implementerar InvokeDefaultAction
Följande villkor kan gälla för en implementering av System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:
När du definierar providerklassen kan en Windows PowerShell objektprovider deklarera providerfunktioner för
ExpandWildcards,Filter,IncludeellerExclude, från uppräkningen System.Management.Automation.Provider.ProviderCapabilities. I dessa fall måste implementeringen av System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction se till att sökvägen som skickas till metoden uppfyller dessa krav. För att göra detta bör metoden komma åt lämplig egenskap, till exempel egenskaperna System.Management.Automation.Provider.CmdletProvider.Exclude och System.Management.Automation.Provider.CmdletProvider.Include .Som standard bör åsidosättningar av den här metoden inte ange eller skriva objekt som är dolda för användaren om inte egenskapen System.Management.Automation.Provider.CmdletProvider.Force är inställd på
true. Ett fel ska skickas till metoden System.Management.Automation.Provider.CmdletProvider.WriteError om sökvägen representerar ett objekt som är dolt för användaren och System.Management.Automation.Provider.CmdletProvider.Force är inställt påfalse.
Hämta dynamiska parametrar för InvokeDefaultAction
Ibland kräver cmdleten Invoke-Item ytterligare parametrar som anges dynamiskt vid körning. För att tillhandahålla dessa dynamiska parametrar måste Windows PowerShell objektprovider implementera metoden System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters. Den här metoden hämtar de dynamiska parametrarna för objektet på den angivna sökvägen och returnerar ett objekt som har egenskaper och fält med parsningsattribut som liknar en cmdlet-klass eller ett System.Management.Automation.RuntimeDefinedParameterDictionary-objekt . Windows PowerShell-körningen använder det returnerade objektet för att lägga till dynamiska parametrar i cmdletenInvoke-Item.
Den här objektprovidern implementerar inte den här metoden. Följande kod är dock standardimplementeringen av den här metoden.
Implementera hjälpmetoder och klasser
Den här objektprovidern implementerar flera hjälpmetoder och klasser som används av de offentliga åsidosättningsmetoder som definieras av Windows PowerShell. Koden för dessa hjälpmetoder och klasser visas i avsnittet Kodexempel .
NormalizePath-metod
Den här objektprovidern implementerar en NormalizePath-hjälpmetod för att säkerställa att sökvägen har ett konsekvent format. Det angivna formatet använder ett omvänt snedstreck (\) som avgränsare.
PathIsDrive-metod
Den här objektprovidern implementerar en PathIsDrive-hjälpmetod för att avgöra om den angivna sökvägen faktiskt är enhetsnamnet.
ChunkPath-metod
Den här objektprovidern implementerar en ChunkPath-hjälpmetod som delar upp den angivna sökvägen så att providern kan identifiera sina enskilda element. Den returnerar en matris som består av sökvägselementen.
GetTable-metod
Den här objektprovidern implementerar hjälpmetoden GetTables som returnerar ett DatabaseTableInfo-objekt som representerar information om tabellen som anges i anropet.
GetRow-metod
Metoden System.Management.Automation.Provider.ItemCmdletProvider.GetItem för den här objektprovidern anropar hjälpmetoden GetRows . Den här hjälpmetoden hämtar ett DatabaseRowInfo-objekt som representerar information om den angivna raden i tabellen.
DatabaseTableInfo-klass
Den här objektprovidern definierar en DatabaseTableInfo-klass som representerar en samling information i en datatabell i databasen. Den här klassen liknar klassen System.IO.Directoryinfo .
Exempelobjektprovidern definierar en DatabaseTableInfo.GetTables-metod som returnerar en samling tabellinformationsobjekt som definierar tabellerna i databasen. Den här metoden innehåller ett try/catch-block för att säkerställa att eventuella databasfel visas som en rad med noll poster.
DatabaseRowInfo-klass
Den här objektprovidern definierar hjälpklassen DatabaseRowInfo som representerar en rad i en tabell i databasen. Den här klassen liknar klassen System.IO.FileInfo .
Exempelprovidern definierar metoden DatabaseRowInfo.GetRows för att returnera en samling radinformationsobjekt för den angivna tabellen. Den här metoden innehåller ett try/catch-block för att fånga undantag. Eventuella fel resulterar inte i någon radinformation.
Kodexempel
Fullständig exempelkod finns i AccessDbProviderSample03-kodexempel.
Definiera objekttyper och formatering
När du skriver en provider kan det vara nödvändigt att lägga till medlemmar i befintliga objekt eller definiera nya objekt. När du är klar skapar du en typfil som Windows PowerShell kan använda för att identifiera medlemmarna i objektet och en formatfil som definierar hur objektet visas. Mer information finns i Utöka objekttyper och formatering.
Skapa Windows PowerShell-providern
Se Registrera cmdletar, leverantörer och värdprogram.
Testa Windows PowerShell-providern
När den här Windows PowerShell objektprovidern är registrerad med Windows PowerShell kan du bara testa providerns grundläggande funktioner och enhetsfunktioner. För att testa manipuleringen av objekt måste du även implementera containerfunktioner som beskrivs i Implementera en container Windows PowerShell provider.
Se även
- Windows PowerShell SDK
- Programmeringsguide för Windows PowerShell
- Skapa Windows PowerShell providers
- Utforma din Windows PowerShell-provider
- Utöka objekttyper och formatering
- Så här fungerar Windows PowerShell
- Skapa en container Windows PowerShell-provider
- Skapa en drive Windows PowerShell-provider
- Registrera cmdletar, leverantörer och värdprogram
Feedback
Skicka och visa feedback för