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 membuat penyedia Windows PowerShell yang dapat bekerja pada penyimpanan data multi-lapis. Untuk jenis penyimpanan data ini, tingkat atas penyimpanan berisi item akar dan setiap tingkat berikutnya disebut sebagai simpul item turunan. Dengan mengizinkan pengguna untuk bekerja pada simpul turunan ini, pengguna dapat berinteraksi secara hierarkis melalui penyimpanan data.
Penyedia yang dapat bekerja pada penyimpanan data multi-level disebut sebagai penyedia kontainer Windows PowerShell. Namun, ketahuilah bahwa penyedia kontainer Windows PowerShell hanya dapat digunakan jika ada satu kontainer (tidak ada kontainer berlapis) dengan item di dalamnya. Jika ada kontainer berlapis, maka Anda harus menerapkan penyedia navigasi Windows PowerShell. Untuk informasi selengkapnya tentang menerapkan penyedia navigasi Windows PowerShell, lihat Membuat Penyedia Navigasi Windows PowerShell.
Nota
Anda dapat mengunduh file sumber C# (AccessDBSampleProvider04.cs) untuk penyedia ini menggunakan Kit Pengembangan Perangkat Lunak Microsoft Windows untuk Windows Vista dan Komponen Runtime .NET Framework 3.0. Untuk petunjuk pengunduhan, lihat Cara Menginstal Windows PowerShell dan Mengunduh Windows PowerShell SDK. File sumber yang diunduh tersedia di <direktori Sampel PowerShell> . Untuk informasi selengkapnya tentang implementasi penyedia Windows PowerShell lainnya, lihat Merancang Penyedia Windows PowerShell Anda.
Penyedia kontainer Windows PowerShell yang dijelaskan di sini mendefinisikan database sebagai kontainer tunggalnya, dengan tabel dan baris database didefinisikan sebagai item kontainer.
Perhatian
Ketahuilah bahwa desain ini mengasumsikan database yang memiliki bidang dengan ID nama, dan jenis bidangnya adalah LongInteger.
Menentukan Kelas Penyedia Kontainer Windows PowerShell
Penyedia kontainer Windows PowerShell harus menentukan kelas .NET yang berasal dari kelas dasar System.Management.Automation.Provider.ContainerCmdletProvider . Berikut adalah definisi kelas untuk penyedia kontainer Windows PowerShell yang dijelaskan di bagian ini.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : ContainerCmdletProvider
Perhatikan bahwa dalam definisi kelas ini, atribut System.Management.Automation.Provider.CmdletProviderAttribute menyertakan dua parameter. Parameter pertama menentukan nama yang mudah digunakan untuk penyedia yang digunakan oleh Windows PowerShell. Parameter kedua menentukan kemampuan khusus Windows PowerShell yang diekspos penyedia ke runtime Windows PowerShell selama pemrosesan perintah. Untuk penyedia ini, tidak ada kemampuan khusus Windows PowerShell yang ditambahkan.
Mendefinisikan Fungsionalitas Dasar
Seperti yang dijelaskan dalam Merancang Penyedia Windows PowerShell Anda, kelas System.Management.Automation.Provider.ContainerCmdletProvider berasal dari beberapa kelas lain yang menyediakan fungsionalitas penyedia yang berbeda. Oleh karena itu, penyedia kontainer Windows PowerShell perlu menentukan semua fungsionalitas yang disediakan oleh kelas tersebut.
Untuk menerapkan fungsionalitas untuk menambahkan informasi inisialisasi khusus sesi dan untuk melepaskan sumber daya yang digunakan oleh penyedia, lihat Membuat Penyedia Windows PowerShell Dasar. Namun, sebagian besar penyedia (termasuk penyedia yang dijelaskan di sini) dapat menggunakan implementasi default fungsionalitas ini yang disediakan oleh Windows PowerShell.
Untuk mendapatkan akses ke penyimpanan data, penyedia harus mengimplementasikan metode kelas dasar System.Management.Automation.Provider.DriveCmdletProvider . Untuk informasi selengkapnya tentang menerapkan metode ini, lihat Membuat Penyedia Drive Windows PowerShell.
Untuk memanipulasi item penyimpanan data, seperti mendapatkan, mengatur, dan menghapus item, penyedia harus menerapkan metode yang disediakan oleh kelas dasar System.Management.Automation.Provider.ItemCmdletProvider . Untuk informasi selengkapnya tentang menerapkan metode ini, lihat Membuat Penyedia Item Windows PowerShell.
Mengambil Item Anak
Untuk mengambil item turunan, penyedia kontainer Windows PowerShell harus mengganti metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* untuk mendukung panggilan dari Get-ChildItem cmdlet. Metode ini mengambil item turunan dari penyimpanan data dan menulisnya ke alur sebagai objek. Jika recurse parameter cmdlet ditentukan, metode akan mengambil semua turunan terlepas dari level mana mereka berada. Jika recurse parameter tidak ditentukan, metode hanya mengambil satu tingkat turunan.
Berikut adalah implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* untuk penyedia ini. Perhatikan bahwa metode ini mengambil item turunan di semua tabel database saat jalur menunjukkan database Access, dan mengambil item turunan dari baris tabel tersebut jika jalur menunjukkan tabel data.
protected override void GetChildItems(string path, bool recurse)
{
// If path represented is a drive then the children in the path are
// tables. Hence all tables in the drive represented will have to be
// returned
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table, path, true);
// if the specified item exists and recurse has been set then
// all child items within it have to be obtained as well
if (ItemExists(path) && recurse)
{
GetChildItems(path + pathSeparator + table.Name, recurse);
}
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get the table name, row number and type of path from the
// path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Obtain all the rows within the table
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row, path + pathSeparator + row.RowNumber,
false);
}
else
{
// In this case, the path specified is not valid
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildItems
Hal-hal yang Perlu Diingat Tentang Menerapkan GetChildItems
Ketentuan berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Saat menentukan kelas penyedia, penyedia kontainer Windows PowerShell mungkin mendeklarasikan kemampuan penyedia ExpandWildcards, Filter, Include, atau Exclude, dari enumerasi System.Management.Automation.Provider.ProviderCapabilities. Dalam kasus ini, implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* perlu memastikan bahwa jalur yang diteruskan ke metode memenuhi persyaratan kemampuan yang ditentukan. Untuk melakukan ini, metode harus mengakses properti yang sesuai, misalnya, properti System.Management.Automation.Provider.CmdletProvider.Exclude* dan System.Management.Automation.Provider.CmdletProvider.Include* .
Penerapan metode ini harus mempertimbangkan segala bentuk akses ke item yang mungkin membuat item terlihat oleh pengguna. Misalnya, jika pengguna memiliki akses tulis ke file melalui penyedia FileSystem (disediakan oleh Windows PowerShell), tetapi bukan akses baca, file tersebut masih ada dan System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* mengembalikan
true. Implementasi Anda mungkin memerlukan pemeriksaan item induk untuk melihat apakah turunan dapat dihitung.Saat menulis beberapa item, metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* dapat memakan waktu. Anda dapat merancang penyedia Anda untuk menulis item menggunakan metode System.Management.Automation.Provider.CmdletProvider.WriteItemObject* satu per satu. Menggunakan teknik ini akan menyajikan item kepada pengguna dalam aliran.
Implementasi Anda dari System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* bertanggung jawab untuk mencegah rekursi tak terbatas saat ada tautan melingkar, dan sejenisnya. Pengecualian penghentian yang sesuai harus dilemparkan untuk mencerminkan kondisi seperti itu.
Melampirkan Parameter Dinamis ke Cmdlet Get-ChildItem
Terkadang Get-ChildItem cmdlet yang memanggil System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia kontainer Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItemsDynamicParameters*. Metode ini mengambil parameter dinamis untuk item di jalur yang ditunjukkan dan mengembalikan objek yang memiliki properti dan bidang dengan atribut penguraian yang mirip dengan kelas cmdlet atau objek System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell menggunakan objek yang dikembalikan untuk menambahkan parameter ke Get-ChildItem cmdlet.
Penyedia kontainer Windows PowerShell ini tidak mengimplementasikan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.
Mengambil Nama Item Turunan
Untuk mengambil nama item turunan, penyedia kontainer Windows PowerShell harus mengganti metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* untuk mendukung panggilan dari Get-ChildItem cmdlet saat parameternya Name ditentukan. Metode ini mengambil nama item turunan untuk jalur yang ditentukan atau nama item turunan untuk semua kontainer jika returnAllContainers parameter cmdlet ditentukan. Nama anak adalah bagian daun dari jalur. Misalnya, nama turunan untuk C:\windows\system32\abc.dll jalur adalah "abc.dll". Nama anak untuk direktori C:\windows\system32 adalah "system32".
Berikut adalah implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* untuk penyedia ini. Perhatikan bahwa metode mengambil nama tabel jika jalur yang ditentukan menunjukkan database Access (drive) dan nomor baris jika jalur menunjukkan tabel.
protected override void GetChildNames(string path,
ReturnContainers returnContainers)
{
// If the path represented is a drive, then the child items are
// tables. get the names of all the tables in the drive.
if (PathIsDrive(path))
{
foreach (DatabaseTableInfo table in GetTables())
{
WriteItemObject(table.Name, path, true);
} // foreach (DatabaseTableInfo...
} // if (PathIsDrive...
else
{
// Get type, table name and row number from path specified
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
// Get all the rows in the table and then write out the
// row numbers.
foreach (DatabaseRowInfo row in GetRows(tableName))
{
WriteItemObject(row.RowNumber, path, false);
} // foreach (DatabaseRowInfo...
}
else if (type == PathType.Row)
{
// In this case the user has directly specified a row, hence
// just give that particular row
DatabaseRowInfo row = GetRow(tableName, rowNumber);
WriteItemObject(row.RowNumber, path, false);
}
else
{
ThrowTerminatingInvalidPathException(path);
}
} // else
} // GetChildNames
Hal-hal yang Perlu Diingat Tentang Menerapkan GetChildNames
Ketentuan berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems*:
Saat menentukan kelas penyedia, penyedia kontainer Windows PowerShell mungkin mendeklarasikan kemampuan penyedia ExpandWildcards, Filter, Include, atau Exclude, dari enumerasi System.Management.Automation.Provider.ProviderCapabilities. Dalam kasus ini, implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* perlu memastikan bahwa jalur yang diteruskan ke metode memenuhi persyaratan kemampuan yang ditentukan. Untuk melakukan ini, metode harus mengakses properti yang sesuai, misalnya, properti System.Management.Automation.Provider.CmdletProvider.Exclude* dan System.Management.Automation.Provider.CmdletProvider.Include* .
Nota
Pengecualian untuk aturan ini terjadi ketika
returnAllContainersparameter cmdlet ditentukan. Dalam hal ini, metode harus mengambil nama turunan apa pun untuk kontainer, meskipun tidak cocok dengan nilai properti System.Management.Automation.Provider.CmdletProvider.Filter*, System.Management.Automation.Provider.CmdletProvider.Include*, atau System.Management.Automation.Provider.CmdletProvider.Exclude*.Secara default, penggantian metode ini tidak boleh mengambil nama objek yang umumnya disembunyikan dari pengguna kecuali properti System.Management.Automation.Provider.CmdletProvider.Force* ditentukan. Jika jalur yang ditentukan menunjukkan kontainer, properti System.Management.Automation.Provider.CmdletProvider.Force* tidak diperlukan.
Implementasi System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNames* bertanggung jawab untuk mencegah rekursi tak terbatas saat ada tautan melingkar, dan sejenisnya. Pengecualian penghentian yang sesuai harus dilemparkan untuk mencerminkan kondisi seperti itu.
Melampirkan Parameter Dinamis ke Cmdlet Get-ChildItem (Nama)
Terkadang Get-ChildItem cmdlet (dengan Name parameter) memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia kontainer Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildNamesDynamicParameters*. Metode ini mengambil parameter dinamis untuk item di jalur yang ditunjukkan dan mengembalikan objek yang memiliki properti dan bidang dengan atribut penguraian yang mirip dengan kelas cmdlet atau objek System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell menggunakan objek yang dikembalikan untuk menambahkan parameter ke Get-ChildItem cmdlet.
Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.
Mengganti Nama Item
Untuk mengganti nama item, penyedia kontainer Windows PowerShell harus mengganti metode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* untuk mendukung panggilan dari Rename-Item cmdlet. Metode ini mengubah nama item di jalur yang ditentukan ke nama baru yang disediakan. Nama baru harus selalu relatif terhadap item induk (kontainer).
Penyedia ini tidak mengganti metode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*. Namun, berikut ini adalah implementasi default.
Hal yang Perlu Diingat Tentang Menerapkan RenameItem
Kondisi berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem*:
Saat menentukan kelas penyedia, penyedia kontainer Windows PowerShell mungkin mendeklarasikan kemampuan penyedia ExpandWildcards, Filter, Include, atau Exclude, dari enumerasi System.Management.Automation.Provider.ProviderCapabilities. Dalam kasus ini, implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* perlu memastikan bahwa jalur yang diteruskan ke metode memenuhi persyaratan kemampuan yang ditentukan. Untuk melakukan ini, metode harus mengakses properti yang sesuai, misalnya, properti System.Management.Automation.Provider.CmdletProvider.Exclude* dan System.Management.Automation.Provider.CmdletProvider.Include* .
Metode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* ditujukan untuk modifikasi nama item saja, dan bukan untuk operasi pemindahan. Implementasi metode Anda harus menulis kesalahan jika parameter berisi
newNamepemisah jalur, atau mungkin menyebabkan item mengubah lokasi induknya.Secara default, penggantian metode ini tidak boleh mengganti nama objek kecuali properti System.Management.Automation.Provider.CmdletProvider.Force* ditentukan. Jika jalur yang ditentukan menunjukkan kontainer, properti System.Management.Automation.Provider.CmdletProvider.Force* tidak diperlukan.
Implementasi Anda dari metode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* harus memanggil System.Management.Automation.Provider.CmdletProvider.ShouldProcess dan memeriksa nilai pengembalian sebelum membuat perubahan apa pun pada penyimpanan data. Metode ini digunakan untuk mengonfirmasi eksekusi operasi ketika perubahan dilakukan pada status sistem, misalnya, mengganti nama file. System.Management.Automation.Provider.CmdletProvider.ShouldProcess mengirimkan nama sumber daya yang akan diubah ke pengguna, dengan runtime Windows PowerShell memperhitungkan pengaturan baris perintah atau variabel preferensi dalam menentukan apa yang harus ditampilkan.
Setelah panggilan ke System.Management.Automation.Provider.CmdletProvider.ShouldProcess mengembalikan
true, metode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItem* harus memanggil metode System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Metode ini mengirimkan pesan pesan konfirmasi ke pengguna untuk memungkinkan umpan balik tambahan untuk mengatakan apakah operasi harus dilanjutkan. Penyedia harus memanggil System.Management.Automation.Provider.CmdletProvider.ShouldContinue sebagai pemeriksaan tambahan untuk modifikasi sistem yang berpotensi berbahaya.
Melampirkan Parameter Dinamis ke Cmdlet Rename-Item
Terkadang Rename-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia kontainer Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ContainerCmdletProvider.RenameItemDynamicParameters*. Metode ini mengambil parameter untuk item di jalur yang ditunjukkan dan mengembalikan objek yang memiliki properti dan bidang dengan atribut penguraian yang mirip dengan kelas cmdlet atau objek System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell menggunakan objek yang dikembalikan untuk menambahkan parameter ke Rename-Item cmdlet.
Penyedia kontainer ini tidak mengimplementasikan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.
Membuat Item Baru
Untuk membuat item baru, penyedia kontainer harus mengimplementasikan metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* untuk mendukung panggilan dari New-Item cmdlet. Metode ini membuat item data yang terletak di jalur yang ditentukan. Parameter type cmdlet berisi jenis yang ditentukan penyedia untuk item baru. Misalnya, penyedia FileSystem menggunakan type parameter dengan nilai "file" atau "direktori". Parameter newItemValue cmdlet menentukan nilai khusus penyedia untuk item baru.
Berikut adalah implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* untuk penyedia ini.
protected override void NewItem( string path, string type, object newItemValue )
{
// Create the new item here after
// performing necessary validations
//
// WriteItemObject(newItemValue, path, false);
// Example
//
// if (ShouldProcess(path, "new item"))
// {
// // Create a new item and then call WriteObject
// WriteObject(newItemValue, path, false);
// }
} // NewItem
{
case 1:
{
string name = pathChunks[0];
if (TableNameIsValid(name))
{
tableName = name;
retVal = PathType.Table;
}
}
break;
case 2:
{
string name = pathChunks[0];
Hal yang Perlu Diingat Tentang Menerapkan NewItem
Ketentuan berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* harus melakukan perbandingan string yang tidak peka huruf besar/kecil dari string yang diteruskan dalam
typeparameter. Ini juga harus memungkinkan kecocokan yang paling tidak ambigu. Misalnya, untuk jenis "file" dan "directory", hanya huruf pertama yang diperlukan untuk mendisambiguasi. Jikatypeparameter menunjukkan jenis yang tidak dapat dibuat oleh penyedia Anda, metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* harus menulis ArgumentException dengan pesan yang menunjukkan jenis yang dapat dibuat oleh penyedia.Untuk
newItemValueparameter, implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* direkomendasikan untuk menerima string minimal. Itu juga harus menerima jenis objek yang diambil oleh metode System.Management.Automation.Provider.ItemCmdletProvider.GetItem* untuk jalur yang sama. Metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* dapat menggunakan metode System.Management.Automation.LanguagePrimitives.ConvertTo* untuk mengonversi jenis ke jenis yang diinginkan.Implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* harus memanggil System.Management.Automation.Provider.CmdletProvider.ShouldProcess dan memeriksa nilai pengembalian sebelum membuat perubahan apa pun pada penyimpanan data. Setelah panggilan ke System.Management.Automation.Provider.CmdletProvider.ShouldProcess mengembalikan true, metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItem* harus memanggil metode System.Management.Automation.Provider.CmdletProvider.ShouldContinue sebagai pemeriksaan tambahan untuk modifikasi sistem yang berpotensi berbahaya.
Melampirkan Parameter Dinamis ke Cmdlet New-Item
Terkadang New-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia kontainer harus menerapkan metode System.Management.Automation.Provider.ContainerCmdletProvider.NewItemDynamicParameters*. Metode ini mengambil parameter untuk item di jalur yang ditunjukkan dan mengembalikan objek yang memiliki properti dan bidang dengan atribut penguraian yang mirip dengan kelas cmdlet atau objek System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell menggunakan objek yang dikembalikan untuk menambahkan parameter ke New-Item cmdlet.
Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.
Menghapus Item
Untuk menghapus item, penyedia Windows PowerShell harus mengganti metode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* untuk mendukung panggilan dari Remove-Item cmdlet. Metode ini menghapus item dari penyimpanan data di jalur yang ditentukan. Jika recurse parameter Remove-Item cmdlet diatur ke true, metode menghapus semua item turunan terlepas dari levelnya. Jika parameter diatur ke false, metode hanya menghapus satu item di jalur yang ditentukan.
Penyedia ini tidak mendukung penghapusan item. Namun, kode berikut adalah implementasi default System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem*.
Hal yang Perlu Diingat Tentang Menerapkan RemoveItem
Ketentuan berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ContainerCmdletProvider.NewItem*:
Saat menentukan kelas penyedia, penyedia kontainer Windows PowerShell mungkin mendeklarasikan kemampuan penyedia ExpandWildcards, Filter, Include, atau Exclude, dari enumerasi System.Management.Automation.Provider.ProviderCapabilities. Dalam kasus ini, implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* perlu memastikan bahwa jalur yang diteruskan ke metode memenuhi persyaratan kemampuan yang ditentukan. Untuk melakukan ini, metode harus mengakses properti yang sesuai, misalnya, properti System.Management.Automation.Provider.CmdletProvider.Exclude* dan System.Management.Automation.Provider.CmdletProvider.Include* .
Secara default, penggantian metode ini tidak boleh menghapus objek kecuali properti System.Management.Automation.Provider.CmdletProvider.Force* diatur ke true. Jika jalur yang ditentukan menunjukkan kontainer, properti System.Management.Automation.Provider.CmdletProvider.Force* tidak diperlukan.
Implementasi Anda dari System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* bertanggung jawab untuk mencegah rekursi tak terbatas saat ada tautan melingkar, dan sejenisnya. Pengecualian penghentian yang sesuai harus dilemparkan untuk mencerminkan kondisi seperti itu.
Implementasi Anda atas metode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* harus memanggil System.Management.Automation.Provider.CmdletProvider.ShouldProcess dan memeriksa nilai yang ditampilkan sebelum membuat perubahan apa pun pada penyimpanan data. Setelah panggilan ke System.Management.Automation.Provider.CmdletProvider.ShouldProcess mengembalikan
true, metode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItem* harus memanggil metode System.Management.Automation.Provider.CmdletProvider.ShouldContinue sebagai pemeriksaan tambahan untuk modifikasi sistem yang berpotensi berbahaya.
Melampirkan Parameter Dinamis ke Cmdlet Remove-Item
Terkadang Remove-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia kontainer harus menerapkan metode System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters* untuk menangani parameter ini. Metode ini mengambil parameter dinamis untuk item di jalur yang ditunjukkan dan mengembalikan objek yang memiliki properti dan bidang dengan atribut penguraian yang mirip dengan kelas cmdlet atau objek System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell menggunakan objek yang dikembalikan untuk menambahkan parameter ke Remove-Item cmdlet.
Penyedia kontainer ini tidak mengimplementasikan metode ini. Namun, kode berikut adalah implementasi default System.Management.Automation.Provider.ContainerCmdletProvider.RemoveItemDynamicParameters*.
Mengkueri Item Turunan
Untuk memeriksa apakah item turunan ada di jalur yang ditentukan, penyedia kontainer Windows PowerShell harus mengganti metode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. Metode ini mengembalikan true jika item memiliki turunan, dan false sebaliknya. Untuk jalur null atau kosong, metode menganggap item apa pun di penyimpanan data sebagai turunan dan mengembalikan true.
Berikut adalah penggantian untuk metode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*. Jika ada lebih dari dua bagian jalur yang dibuat oleh metode pembantu ChunkPath, metode mengembalikan false, karena hanya kontainer database dan kontainer tabel yang ditentukan. Untuk informasi selengkapnya tentang metode pembantu ini, lihat metode ChunkPath yang dibahas dalam Membuat Penyedia Item Windows PowerShell.
protected override bool HasChildItems( string path )
{
return false;
} // HasChildItems
ErrorCategory.InvalidOperation, tableName));
}
return results;
Hal yang Perlu Diingat Tentang Menerapkan HasChildItems
Kondisi berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems*:
- Jika penyedia kontainer mengekspos akar yang berisi titik pemasangan yang menarik, implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.HasChildItems* akan dikembalikan
truesaat null atau string kosong diteruskan untuk jalur.
Menyalin Item
Untuk menyalin item, penyedia kontainer harus mengimplementasikan metode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem untuk mendukung panggilan dari Copy-Item cmdlet. Metode ini menyalin item data dari lokasi yang ditunjukkan oleh path parameter cmdlet ke lokasi yang ditunjukkan oleh copyPath parameter. Jika recurse parameter ditentukan, metode menyalin semua sub-kontainer. Jika parameter tidak ditentukan, metode hanya menyalin satu tingkat item.
Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem.
Hal yang Perlu Diingat Tentang Menerapkan CopyItem
Kondisi berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem:
Saat menentukan kelas penyedia, penyedia kontainer Windows PowerShell mungkin mendeklarasikan kemampuan penyedia ExpandWildcards, Filter, Include, atau Exclude, dari enumerasi System.Management.Automation.Provider.ProviderCapabilities. Dalam kasus ini, implementasi metode System.Management.Automation.Provider.ContainerCmdletProvider.GetChildItems* perlu memastikan bahwa jalur yang diteruskan ke metode memenuhi persyaratan kemampuan yang ditentukan. Untuk melakukan ini, metode harus mengakses properti yang sesuai, misalnya, properti System.Management.Automation.Provider.CmdletProvider.Exclude* dan System.Management.Automation.Provider.CmdletProvider.Include* .
Secara default, penggantian metode ini tidak boleh menyalin objek di atas objek yang ada kecuali properti System.Management.Automation.Provider.CmdletProvider.Force* diatur ke
true. Misalnya, penyedia FileSystem tidak akan menyalin C:\temp\abc.txt file C:\abc.txt yang ada kecuali properti System.Management.Automation.Provider.CmdletProvider.Force* diatur ketrue. Jika jalur yang ditentukan dalamcopyPathparameter ada dan menunjukkan kontainer, properti System.Management.Automation.Provider.CmdletProvider.Force* tidak diperlukan. Dalam hal ini, System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem harus menyalin item yang ditunjukkan olehpathparameter ke kontainer yang ditunjukkan olehcopyPathparameter sebagai turunan.Implementasi System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem bertanggung jawab untuk mencegah rekursi tak terbatas saat ada tautan melingkar, dan sejenisnya. Pengecualian penghentian yang sesuai harus dilemparkan untuk mencerminkan kondisi seperti itu.
Implementasi Anda dari metode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem harus memanggil System.Management.Automation.Provider.CmdletProvider.ShouldProcess dan memeriksa nilai yang dikembalikan sebelum membuat perubahan apa pun pada penyimpanan data. Setelah panggilan ke System.Management.Automation.Provider.CmdletProvider.ShouldProcess mengembalikan true, metode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItem harus memanggil metode System.Management.Automation.Provider.CmdletProvider.ShouldContinue sebagai pemeriksaan tambahan untuk modifikasi sistem yang berpotensi berbahaya. Untuk informasi selengkapnya tentang memanggil metode ini, lihat Mengganti Nama Item.
Melampirkan Parameter Dinamis ke Cmdlet Copy-Item
Terkadang Copy-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia kontainer Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters* untuk menangani parameter ini. Metode ini mengambil parameter untuk item di jalur yang ditunjukkan dan mengembalikan objek yang memiliki properti dan bidang dengan atribut penguraian yang mirip dengan kelas cmdlet atau objek System.Management.Automation.RuntimeDefinedParameterDictionary . Runtime Windows PowerShell menggunakan objek yang dikembalikan untuk menambahkan parameter ke Copy-Item cmdlet.
Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default System.Management.Automation.Provider.ContainerCmdletProvider.CopyItemDynamicParameters*.
Sampel Kode
Untuk kode sampel lengkap, lihat Sampel Kode AccessDbProviderSample04.
Membangun Penyedia Windows PowerShell
Lihat Cara mendaftarkan cmdlet, penyedia, dan aplikasi host.
Menguji Penyedia Windows PowerShell
Ketika penyedia Windows PowerShell Anda telah terdaftar dengan Windows PowerShell, Anda dapat mengujinya dengan menjalankan cmdlet yang didukung pada baris perintah. Perhatikan bahwa contoh output berikut menggunakan database Access fiktif.
Jalankan
Get-ChildItemcmdlet untuk mengambil daftar item turunan dari tabel Pelanggan di database Access.Get-ChildItem mydb:customersOutput berikut muncul.
PSPath : AccessDB::customers PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : True Data : System.Data.DataRow Name : Customers RowCount : 91 Columns :Jalankan
Get-ChildItemcmdlet lagi untuk mengambil data tabel.(Get-ChildItem mydb:customers).DataOutput berikut muncul.
TABLE_CAT : C:\PS\northwind TABLE_SCHEM : TABLE_NAME : Customers TABLE_TYPE : TABLE REMARKS :Sekarang gunakan
Get-Itemcmdlet untuk mengambil item di baris 0 dalam tabel data.Get-Item mydb:\customers\0Output berikut muncul.
PSPath : AccessDB::customers\0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Gunakan
Get-Itemkembali untuk mengambil data untuk item di baris 0.(Get-Item mydb:\customers\0).DataOutput berikut muncul.
CustomerID : 1234 CompanyName : Fabrikam ContactName : Eric Gruber ContactTitle : President Address : 4567 Main Street City : Buffalo Region : NY PostalCode : 98052 Country : USA Phone : (425) 555-0100 Fax : (425) 555-0101Sekarang gunakan
New-Itemcmdlet untuk menambahkan baris ke tabel yang ada. Parameter menentukanPathjalur lengkap ke baris, dan harus menunjukkan nomor baris yang lebih besar dari jumlah baris yang ada dalam tabel. Parameter menunjukkanTypeRowuntuk menentukan jenis item yang akan ditambahkan. Terakhir, parameter menentukanValuedaftar nilai kolom yang dibatasi koma untuk baris.New-Item -Path mydb:\Customers\3 -ItemType "Row" -Value "3,CustomerFirstName,CustomerLastName,CustomerEmailAddress,CustomerTitle,CustomerCompany,CustomerPhone, CustomerAddress,CustomerCity,CustomerState,CustomerZip,CustomerCountry"Verifikasi kebenaran operasi item baru sebagai berikut.
PS mydb:\> cd Customers PS mydb:\Customers> (Get-Item 3).DataOutput berikut muncul.
ID : 3 FirstName : Eric LastName : Gruber Email : ericgruber@fabrikam.com Title : President Company : Fabrikam WorkPhone : (425) 555-0100 Address : 4567 Main Street City : Buffalo State : NY Zip : 98052 Country : USA
Lihat Juga
Membuat Penyedia Windows PowerShell
Merancang Penyedia Windows PowerShell Anda
Menerapkan Item Penyedia Windows PowerShell
Menerapkan Navigasi Penyedia Windows PowerShell