Bir öğe sağlayıcı yazma
Bu konu, veri deposundaki öğelere erişen ve bunları işleyen bir Windows PowerShell sağlayıcısının yöntemlerinin nasıl uygulanacağını açıklamaktadır. Öğelere erişebilmek için bir sağlayıcının System.Management.Automation.Provider.Itemcmdletprovider sınıfından türetmesi gerekir.
Bu konudaki örneklerdeki sağlayıcı, veri deposu olarak Access veritabanını kullanır. Veritabanıyla etkileşimde bulunmak için kullanılan çeşitli yardımcı yöntemler ve sınıflar vardır. Yardımcı yöntemleri içeren numunenin tamamı 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ı değiştirmek için kullanılabilecek çeşitli yöntemleri ortaya çıkarır. Bu yöntemlerin tam listesi için bkz. ItemCmdletProvider Yöntemleri. Bu örnekte bu yöntemlerden dördünü 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 mevcut olup olmadığını denetler. System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath*, veri deposundaki bir konumla eşleşip eşleşmediğini görmek için bir yolu denetler.
Not
Bu konu, Windows PowerShell Sağlayıcısı Hızlı Başlangıç'taki bilgilere dayanmaktadır. Bu konu, bir sağlayıcı projesinin nasıl kurulacağı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ğına ilişkin temel bilgileri kapsamaz.
Sağlayıcı sınıfını bildirme
Sağlayıcının System.Management.Automation.Provider.Itemcmdletprovider sınıfından türeteceğini ve bunu System.Management.Automation.Provider.Cmdletprovide özelliğiyle süsleyeceğini bildirin.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ItemCmdletProvider
{
}
GetItem'in Uygulanması
System.Management.Automation.Provider.Itemcmdletprovider.Getitem*, bir kullanıcı sağlayıcınızda Microsoft.PowerShell.Commands.GetItemCommand cmdlet'ini çağırdığında PowerShell motoru tarafından çağrılır. Yöntem, belirtilen yoldaki öğeyi döndürür. Access veritabanı örneğinde yöntem, öğenin sürücünün kendisi mi, veritabanındaki bir tablo mu yoksa veritabanındaki bir satır mı olduğunu denetler. Yöntem, System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* yöntemini çağırarak öğeyi PowerShell motoruna 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'in Uygulanması
System.Management.Automation.Provider.Itemcmdletprovider.Setitem* yöntemi, bir kullanıcı Microsoft.PowerShell.Commands.SetItemCommand cmdlet'ini çağırdığında PowerShell altyapısı çağrıları tarafından çağrılır. Belirtilen yoldaki öğenin değerini ayarlar.
Access veritabanı örneğinde, bir öğenin değerini yalnızca o öğe bir satırsa ayarlamak mantıklıdır; bu nedenle, öğe bir satır olmadığında yöntem 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'in Uygulanması
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öntem, belirtilen yolda bir öğe olup olmadığını belirler. Öğe mevcutsa, yöntem onu System.Management.Automation.Provider.Cmdletprovider.Writeitemobject* çağırarak PowerShell motoruna geri iletir.
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'in uygulanması
System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath* yöntemi, belirtilen yolun geçerli sağlayıcı için sözdizimsel olarak geçerli olup olmadığını denetler. Yolda bir öğenin bulunup bulunmadığını kontrol etmez.
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ı, başka öğeler içeren öğeleri destekleyebilir ve öğeleri sürücü içinde bir yoldan diğerine taşıyabilir. Kapsayıcıları destekleyen bir sağlayıcı örneği için bkz. Kapsayıcı sağlayıcı yazma. Öğelerin taşınmasını destekleyen bir sağlayıcı örneği için bkz. Gezinme sağlayıcısı yazma.
Ayrıca Bakınız
Bir konteyner sağlayıcısı yazma
Gezinme sağlayıcısı yazma
Windows PowerShell Sağlayıcısına Genel Bakış