Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini menjelaskan cara menerapkan metode penyedia Windows PowerShell yang mendukung kontainer berlapis (penyimpanan data multi-tingkat), memindahkan item, dan jalur relatif. Penyedia navigasi harus berasal dari kelas System.Management.Automation.Provider.NavigationCmdletProvider.
Penyedia dalam contoh dalam topik ini menggunakan database Access sebagai penyimpanan datanya. Ada beberapa metode dan kelas pembantu yang digunakan untuk berinteraksi dengan database. Untuk sampel lengkap yang menyertakan metode pembantu, lihat AccessDBProviderSample05.
Untuk informasi selengkapnya tentang penyedia Windows PowerShell, lihat Gambaran Umum Penyedia Windows PowerShell.
Menerapkan metode navigasi
Kelas System.Management.Automation.Provider.NavigationCmdletProvider mengimplementasikan metode yang mendukung kontainer berlapis, jalur relatif, dan item bergerak. Untuk daftar lengkap metode ini, lihat Metode NavigationCmdletProvider.
Nota
Topik ini dibangun berdasarkan informasi di Mulai Cepat Penyedia Windows PowerShell. Topik ini tidak mencakup dasar-dasar cara menyiapkan proyek penyedia, atau cara menerapkan metode yang diwariskan dari System.Management.Automation.Provider.DriveCmdletProvider kelas yang membuat dan menghapus drive. Topik ini juga tidak mencakup cara menerapkan metode yang diekspos oleh System.Management.Automation.Provider.ItemCmdletProvider atau System.Management.Automation.Provider.ContainerCmdletProvider kelas. Untuk contoh yang menunjukkan cara menerapkan cmdlet item, lihat Menulis penyedia item. Untuk contoh yang menunjukkan cara menerapkan cmdlet kontainer, lihat Menulis penyedia kontainer.
Mendeklarasikan kelas penyedia
Deklarasikan penyedia untuk berasal dari kelas System.Management.Automation.Provider.NavigationCmdletProvider, dan hiasi dengan System.Management.Automation.Provider.CmdletProviderAttribute.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
{
}
Menerapkan IsItemContainer
Metode System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* memeriksa apakah item di jalur yang ditentukan adalah kontainer.
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;
}
Menerapkan GetChildName
Metode System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* mendapatkan properti nama item anak di jalur yang ditentukan. Jika item di jalur yang ditentukan bukan anak dari kontainer, maka metode ini harus mengembalikan jalur.
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;
}
Menerapkan GetParentPath
Metode System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* mendapatkan jalur induk item di jalur yang ditentukan. Jika item di jalur yang ditentukan adalah akar penyimpanan data (sehingga tidak memiliki induk), maka metode ini harus mengembalikan jalur akar.
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));
}
Menerapkan MakePath
Metode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* menggabungkan jalur induk tertentu dan jalur turunan tertentu untuk membuat jalur internal penyedia (untuk informasi tentang jenis jalur yang dapat didukung penyedia, lihat Gambaran Umum Penyedia Windows PowerShell. Mesin PowerShell memanggil metode ini saat pengguna memanggil cmdlet 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;
}
Menerapkan NormalizeRelativePath
Metode System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* mengambil parameter path
dan basepath
, dan mengembalikan jalur yang dinormalisasi yang setara dengan parameter path
dan relatif terhadap parameter basepath
.
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);
}
}
Menerapkan MoveItem
Metode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* memindahkan item dari jalur yang ditentukan ke jalur tujuan yang ditentukan. Mesin PowerShell memanggil metode ini saat pengguna memanggil microsoft.PowerShell.Commands.MoveItemCommand cmdlet.
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);
}
}
}
Lihat Juga
Menulis penyedia kontainer