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 konuda, veri deposundaki öğelere erişen ve bunları işleyen bir Windows PowerShell sağlayıcısının yöntemlerinin nasıl uygulandığı açıklanmaktadır. Öğelere erişebilmek için sağlayıcının System.Management.Automation.Provider.ItemCmdletProvider sınıfından türetilmesi gerekir.
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. AccessDBProviderSample03
Windows PowerShell sağlayıcıları hakkında daha fazla bilgi için bkz. Windows PowerShell Sağlayıcısına Genel Bakış.
Öğe yöntemlerini uygulama
System.Management.Automation.Provider.ItemCmdletProvider sınıfı, bir veri deposundaki öğelere erişmek ve bunları işlemek için kullanılabilecek çeşitli yöntemleri kullanıma sunar. Bu yöntemlerin tam listesi için bkz. ItemCmdletProvider Methods. Bu örnekte, bu yöntemlerden dört tane uygulayacağız. System.Management.Automation.Provider.ItemCmdletProvider.GetItem* belirtilen yolda bir öğe alır. System.Management.Automation.Provider.ItemCmdletProvider.SetItem* belirtilen öğenin değerini ayarlar. System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* belirtilen yolda bir öğenin var olup olmadığını denetler. System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath* veri deposundaki bir konuma eşlenip eşlemediğini görmek için bir yolu denetler.
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.
Sağlayıcı sınıfını bildirme
System.Management.Automation.Provider.ItemCmdletProvider 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 : ItemCmdletProvider
{
}
GetItem Uygulama
System.Management.Automation.Provider.ItemCmdletProvider.GetItem*, bir kullanıcı sağlayıcınızda Microsoft.PowerShell.Commands.GetItemCommand cmdlet'ini çağırdığında PowerShell altyapısı tarafından çağrılır. yöntemi, belirtilen yolda öğeyi döndürür. Access veritabanı örneğinde yöntemi, öğenin sürücünün kendisi mi, veritabanındaki bir tablo mu yoksa veritabanındaki bir satır mı olduğunu denetler. yöntemi, System.Management.Automation.Provider.CmdletProvider.WriteItemObject* yöntemini çağırarak öğeyi PowerShell altyapısına gönderir.
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);
}
}
SetItem Uygulama
System.Management.Automation.Provider.ItemCmdletProvider.SetItem* yöntemi, kullanıcı microsoft.powershell.commands.setitemcommand cmdlet'ini çağırdığında PowerShell altyapısı çağrıları tarafından çağrılır. Belirtilen yolda öğenin değerini ayarlar.
Access veritabanı örneğinde, bir öğenin değerini yalnızca bu öğe bir satır olduğunda ayarlamak mantıklıdır; bu nedenle yöntem, öğe satır olmadığında NotSupportedException oluşturur.
protected override void SetItem(string path, object values)
{
// Get type, table name and row number from the path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type != PathType.Row)
{
WriteError(new ErrorRecord(new NotSupportedException(
"SetNotSupported"), "",
ErrorCategory.InvalidOperation, path));
return;
}
// Get in-memory representation of table
OdbcDataAdapter da = GetAdapterForTable(tableName);
if (da == null)
{
return;
}
DataSet ds = GetDataSetForTable(da, tableName);
DataTable table = GetDataTable(ds, tableName);
if (rowNumber >= table.Rows.Count)
{
// The specified row number has to be available. If not
// NewItem has to be used to add a new row
throw new ArgumentException("Row specified is not available");
} // if (rowNum...
string[] colValues = (values as string).Split(',');
// set the specified row
DataRow row = table.Rows[rowNumber];
for (int i = 0; i < colValues.Length; i++)
{
row[i] = colValues[i];
}
// Update the table
if (ShouldProcess(path, "SetItem"))
{
da.Update(ds, tableName);
}
}
ItemExists Uygulama
System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* yöntemi, bir kullanıcı Microsoft.PowerShell.Commands.TestPathCommand cmdlet'ini çağırdığında PowerShell altyapısı tarafından çağrılır. yöntemi, belirtilen yolda bir öğe olup olmadığını belirler. Öğe varsa, yöntemi System.Management.Automation.Provider.CmdletProvider.WriteItemObject*çağırarak öğeyi PowerShell altyapısına geri geçirir.
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;
}
IsValidPath Uygulama
System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath* yöntemi, belirtilen yolun geçerli sağlayıcı için bozulmadan geçerli olup olmadığını denetler. Yolda bir öğenin var olup olmadığını denetlemez.
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;
}
Sonraki adımlar
Tipik bir gerçek dünya sağlayıcısı, diğer öğeleri içeren öğeleri destekleme ve öğeleri sürücüdeki bir yoldan diğerine taşıma özelliğine sahiptir. Kapsayıcıları destekleyen bir sağlayıcı örneği için bkz. Kapsayıcı sağlayıcısı yazma. Öğeleri taşımayı destekleyen bir sağlayıcı örneği için bkz. gezinti sağlayıcısı yazma .
Ayrıca Bkz.
PowerShell