Een navigatieprovider schrijven
In dit onderwerp wordt beschreven hoe u de methoden implementeert van een Windows PowerShell-provider die ondersteuning biedt voor geneste containers (gegevensopslag op meerdere niveau), het verplaatsen van items en relatieve paden. Een navigatieprovider moet zijn afgeleid van de klasse System.Management.Automation.Provider.Navigationcmdletprovider.
De provider in de voorbeelden in dit onderwerp gebruikt een Access-database als gegevensopslag. Er zijn verschillende helpermethoden en -klassen die worden gebruikt voor interactie met de database. Zie AccessDBProviderSample05voor het volledige voorbeeld met de helpermethoden.
Zie voor meer informatie Windows PowerShell providers Windows PowerShell Provider Overview.
Navigatiemethoden implementeren
De klasse System.Management.Automation.Provider.Navigationcmdletprovider implementeert methoden die ondersteuning bieden voor geneste containers, relatieve paden en het verplaatsen van items. Zie NavigationCmdletProvider Methodsvoor een volledige lijst van deze methoden.
Notitie
Dit onderwerp bouwt voort op de informatie in Windows PowerShell Provider QuickStart. In dit onderwerp worden niet de basisbeginselen besproken van het instellen van een providerproject of het implementeren van de methoden die zijn overgenomen van de klasse System.Management.Automation.Provider.Drivecmdletprovider voor het maken en verwijderen van stations. In dit onderwerp wordt ook niet besproken hoe u methoden implementeert die worden blootgesteld door de klassen System.Management.Automation.Provider.Itemcmdletprovider of System.Management.Automation.Provider.Containercmdletprovider. Zie Een itemproviderschrijven voor een voorbeeld van het implementeren van item-cmdlets. Zie Een containerproviderschrijven voor een voorbeeld van het implementeren van container-cmdlets.
De providerklasse declareren
Declareer de provider om af te leiden van de klasse System.Management.Automation.Provider.Navigationcmdletprovider en gebruik de klasse System.Management.Automation.Provider.Cmdletproviderattribute.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
{
}
IsItemContainer implementeren
De methode System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* controleert of het item op het opgegeven pad een container is.
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;
}
GetChildName implementeren
De methode System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname* haalt de naam-eigenschap op van het onderliggende item op het opgegeven pad. Als het item op het opgegeven pad geen onderliggend item van een container is, moet deze methode het pad retourneren.
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;
}
GetParentPath implementeren
Met de methode System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* wordt het pad van het bovenliggende item op het opgegeven pad opgeslagen. Als het item op het opgegeven pad de hoofdmap van het gegevensopslag is (zodat het geen bovenliggend item heeft), moet deze methode het hoofdpad retourneren.
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));
}
MakePath implementeren
De methode System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* voegt een opgegeven bovenliggend pad en een opgegeven onderliggend pad toe om een intern providerpad te maken (zie overzicht van Windows PowerShell-providervoor informatie over padtypen die providers kunnen ondersteunen. De PowerShell-engine roept deze methode aan wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.JoinPathCommand aanroept.
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;
}
NormalizeRelativePath implementeren
De methode System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* gebruikt de parameters en en retourneert een genormaliseerd pad dat gelijk is aan de parameter en ten opzichte van de path basepath path basepath parameter.
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);
}
}
MoveItem implementeren
De methode System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* verplaatst een item van het opgegeven pad naar het opgegeven doelpad. De PowerShell-engine roept deze methode aan wanneer een gebruiker de cmdlet Microsoft.PowerShell.Commands.MoveItemCommand aanroept.
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);
}
}
}
Zie ook
Feedback
Feedback verzenden en weergeven voor