Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu, iç içe kapsayıcıları (çok düzeyli veri depoları), öğeleri taşımayı ve göreli yolları destekleyen bir Windows PowerShell sağlayıcısının yöntemlerinin nasıl uygulandığını açıklar. Gezinti sağlayıcısı, System.Management.Automation.Provider.NavigationCmdletProvider sınıfından türetilmelidir.
Bu konudaki örneklerde yer alan sağlayıcı, veri deposu olarak bir Access veritabanı kullanır. Veritabanıyla etkileşime geçmek için kullanılan çeşitli yardımcı yöntemler ve sınıflar vardır. Yardımcı yöntemleri içeren tam örnek için bkz. AccessDBProviderSample05.
Windows PowerShell sağlayıcıları hakkında daha fazla bilgi için bkz. Windows PowerShell Sağlayıcısına Genel Bakış.
Gezinti yöntemlerini uygulama
System.Management.Automation.Provider.NavigationCmdletProvider sınıfı iç içe kapsayıcıları, göreli yolları ve öğeleri taşımayı destekleyen yöntemler uygular. Bu yöntemlerin tam listesi için bkz. NavigationCmdletProvider Methods.
Uyarı
Bu konu, Windows PowerShell Sağlayıcısı Hızlı Başlangıçbilgileri temel alır. Bu konu, bir sağlayıcı projesinin nasıl ayarlanacağına veya sürücüleri oluşturup kaldıran System.Management.Automation.Provider.DriveCmdletProvider sınıfından devralınan yöntemlerin nasıl uygulanacağıyla ilgili temel bilgileri kapsamaz. Bu konu, System.Management.Automation.Provider.ItemCmdletProvider veya System.Management.Automation.Provider.ContainerCmdletProvider sınıfları tarafından kullanıma sunulan yöntemlerin nasıl uygulandığını da kapsamaz. Öğe cmdlet'lerinin nasıl uygulandığını gösteren bir örnek için bkz. Öğe sağlayıcısı yazma. Kapsayıcı cmdlet'lerinin nasıl uygulandığını gösteren bir örnek için bkz. Kapsayıcı sağlayıcısı yazma.
Sağlayıcı sınıfını bildirme
System.Management.Automation.Provider.NavigationCmdletProvider sınıfından türetilen sağlayıcıyı bildirin ve System.Management.Automation.Provider.CmdletProviderAttributeile süsleyin.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
{
}
IsItemContainer Uygulama
System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* yöntemi, belirtilen yoldaki öğenin kapsayıcı olup olmadığını denetler.
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 Uygulama
System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* yöntemi, belirtilen yolda alt öğenin name özelliğini alır. Belirtilen yoldaki öğe bir kapsayıcının alt öğesi değilse, bu yöntem yolu döndürmelidir.
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 Uygulama
System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* yöntemi, belirtilen yolda öğenin üst öğesinin yolunu alır. Belirtilen yoldaki öğe veri deposunun köküyse (yani üst öğesi yoksa), bu yöntem kök yolu döndürmelidir.
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 Uygulama
System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* yöntemi, sağlayıcı-iç yol oluşturmak için belirtilen üst yol ile belirtilen alt yolu birleştirir (sağlayıcıların destekleyebilecekleri yol türleri hakkında bilgi için bkz. Windows PowerShell Sağlayıcısına Genel Bakış. Kullanıcı Microsoft.PowerShell.Commands.JoinPathCommand cmdlet'ini çağırdığında PowerShell altyapısı bu yöntemi çağırır.
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 Uygulama
System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* yöntemi path ve basepath parametreleri alır ve path parametresine eşdeğer ve basepath parametresine göre normalleştirilmiş bir yol döndürür.
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 Uygulama
System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* yöntemi bir öğeyi belirtilen yoldan belirtilen hedef yola taşır. Kullanıcı Microsoft.PowerShell.Commands.MoveItemCommand cmdlet'ini çağırdığında PowerShell altyapısı bu yöntemi çağırır.
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);
}
}
}
Ayrıca Bkz.
PowerShell