Skriva en navigeringsprovider
Det här avsnittet beskriver hur du implementerar metoder för en Windows PowerShell-provider som stöder kapslade containrar (datalager på flera nivåer), flytta objekt och relativa sökvägar. En navigeringsprovider måste härleds från klassen System.Management.Automation.Provider.Navigationcmdletprovider.
Providern i exemplen i det här avsnittet använder en Access-databas som datalager. Det finns flera hjälpmetoder och klasser som används för att interagera med databasen. Det fullständiga exemplet som innehåller hjälpmetoderna finns i AccessDBProviderSample05.
Mer information om Windows PowerShell finns i översikten Windows PowerShell providern.
Implementera navigeringsmetoder
Klassen System.Management.Automation.Provider.Navigationcmdletprovider implementerar metoder som stöder kapslade containrar, relativa sökvägar och flytta objekt. En fullständig lista över dessa metoder finns i NavigationCmdletProvider Methods.
Anteckning
Det här avsnittet bygger på informationen i snabbstarten Windows PowerShell provider. Det här avsnittet går inte in på grunderna i hur du ställer in ett providerprojekt eller hur du implementerar de metoder som ärvts från klassen System.Management.Automation.Provider.Drivecmdletprovider som skapar och tar bort enheter. Det här avsnittet omfattar inte heller hur du implementerar metoder som exponeras av klasserna System.Management.Automation.Provider.Itemcmdletprovider eller System.Management.Automation.Provider.Containercmdletprovider. Ett exempel som visar hur du implementerar objekt-cmdlets finns i Skriva en objektprovider. Ett exempel som visar hur du implementerar container-cmdlets finns i Skriva en containerprovider.
Deklarera providerklassen
Deklarera providern så att den härleds från klassen System.Management.Automation.Provider.Navigationcmdletprovider och förser den med klassen System.Management.Automation.Provider.Cmdletproviderattribute.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
{
}
Implementera IsItemContainer
Metoden System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* kontrollerar om objektet på den angivna sökvägen är en container.
protected override bool IsItemContainer(string path)
{
if (PathIsDrive(path))
{
return true;
}
string[] pathChunks = ChunkPath(path);
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
foreach (DatabaseTableInfo ti in GetTables())
{
if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
{
return true;
}
} // foreach (DatabaseTableInfo...
} // if (pathChunks...
return false;
}
Implementera GetChildName
Metoden System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname* hämtar egenskapen name för det underordnade objektet på den angivna sökvägen. Om objektet på den angivna sökvägen inte är underordnad en container ska den här metoden returnera sökvägen.
protected override string GetChildName(string path)
{
if (PathIsDrive(path))
{
return path;
}
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
return tableName;
}
else if (type == PathType.Row)
{
return rowNumber.ToString(CultureInfo.CurrentCulture);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
return null;
}
Implementera GetParentPath
Metoden System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* hämtar sökvägen till det överordnade objektet på den angivna sökvägen. Om objektet på den angivna sökvägen är roten för datalagret (så att det inte har något överordnat) ska den här metoden returnera rotsökvägen.
protected override string GetParentPath(string path, string root)
{
// If root is specified then the path has to contain
// the root. If not nothing should be returned
if (!String.IsNullOrEmpty(root))
{
if (!path.Contains(root))
{
return null;
}
}
return path.Substring(0, path.LastIndexOf(pathSeparator, StringComparison.OrdinalIgnoreCase));
}
Implementera MakePath
Metoden System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* ansluter till en angiven överordnad sökväg och en angiven underordnad sökväg för att skapa en provider-intern sökväg (information om sökvägstyper som leverantörer kan stödja finns i översikten överWindows PowerShell-providern . PowerShell-motorn anropar den här metoden när en användare anropar cmdleten Microsoft.PowerShell.Commands.JoinPathCommand.
protected override string MakePath(string parent, string child)
{
string result;
string normalParent = NormalizePath(parent);
normalParent = RemoveDriveFromPath(normalParent);
string normalChild = NormalizePath(child);
normalChild = RemoveDriveFromPath(normalChild);
if (String.IsNullOrEmpty(normalParent) && String.IsNullOrEmpty(normalChild))
{
result = String.Empty;
}
else if (String.IsNullOrEmpty(normalParent) && !String.IsNullOrEmpty(normalChild))
{
result = normalChild;
}
else if (!String.IsNullOrEmpty(normalParent) && String.IsNullOrEmpty(normalChild))
{
if (normalParent.EndsWith(pathSeparator, StringComparison.OrdinalIgnoreCase))
{
result = normalParent;
}
else
{
result = normalParent + pathSeparator;
}
} // else if (!String...
else
{
if (!normalParent.Equals(String.Empty) &&
!normalParent.EndsWith(pathSeparator, StringComparison.OrdinalIgnoreCase))
{
result = normalParent + pathSeparator;
}
else
{
result = normalParent;
}
if (normalChild.StartsWith(pathSeparator, StringComparison.OrdinalIgnoreCase))
{
result += normalChild.Substring(1);
}
else
{
result += normalChild;
}
} // else
return result;
}
Implementera NormalizeRelativePath
Metoden System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* tar parametrarna och och returnerar en normaliserad sökväg som motsvarar parametern och i förhållande till path basepath path basepath parametern.
protected override string NormalizeRelativePath(string path,
string basepath)
{
// Normalize the paths first
string normalPath = NormalizePath(path);
normalPath = RemoveDriveFromPath(normalPath);
string normalBasePath = NormalizePath(basepath);
normalBasePath = RemoveDriveFromPath(normalBasePath);
if (String.IsNullOrEmpty(normalBasePath))
{
return normalPath;
}
else
{
if (!normalPath.Contains(normalBasePath))
{
return null;
}
return normalPath.Substring(normalBasePath.Length + pathSeparator.Length);
}
}
Implementera MoveItem
Metoden System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* flyttar ett objekt från den angivna sökvägen till den angivna målsökvägen. PowerShell-motorn anropar den här metoden när en användare anropar cmdleten Microsoft.PowerShell.Commands.MoveItemCommand.
protected override void MoveItem(string path, string destination)
{
// Get type, table name and rowNumber from the path
string tableName, destTableName;
int rowNumber, destRowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
PathType destType = GetNamesFromPath(destination, out destTableName,
out destRowNumber);
if (type == PathType.Invalid)
{
ThrowTerminatingInvalidPathException(path);
}
if (destType == PathType.Invalid)
{
ThrowTerminatingInvalidPathException(destination);
}
if (type == PathType.Table)
{
ArgumentException e = new ArgumentException("Move not supported for tables");
WriteError(new ErrorRecord(e, "MoveNotSupported",
ErrorCategory.InvalidArgument, path));
throw e;
}
else
{
OdbcDataAdapter da = GetAdapterForTable(tableName);
if (da == null)
{
return;
}
DataSet ds = GetDataSetForTable(da, tableName);
DataTable table = GetDataTable(ds, tableName);
OdbcDataAdapter dda = GetAdapterForTable(destTableName);
if (dda == null)
{
return;
}
DataSet dds = GetDataSetForTable(dda, destTableName);
DataTable destTable = GetDataTable(dds, destTableName);
DataRow row = table.Rows[rowNumber];
if (destType == PathType.Table)
{
DataRow destRow = destTable.NewRow();
destRow.ItemArray = row.ItemArray;
}
else
{
DataRow destRow = destTable.Rows[destRowNumber];
destRow.ItemArray = row.ItemArray;
}
// Update the changes
if (ShouldProcess(path, "MoveItem"))
{
WriteItemObject(row, path, false);
dda.Update(dds, destTableName);
}
}
}
Se även
Feedback
Skicka och visa feedback för