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 navigasi Windows PowerShell yang dapat menavigasi penyimpanan data. Jenis penyedia ini mendukung perintah rekursif, kontainer berlapis, dan jalur relatif.
Nota
Anda dapat mengunduh file sumber C# (AccessDBSampleProvider05.cs) untuk penyedia ini menggunakan Kit Pengembangan Perangkat Lunak Microsoft Windows untuk Komponen Runtime Windows Vista dan .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 yang dijelaskan di sini memungkinkan pengguna menangani database Access sebagai drive sehingga pengguna dapat menavigasi ke tabel data dalam database. Saat membuat penyedia navigasi Anda sendiri, Anda dapat menerapkan metode yang dapat membuat jalur yang memenuhi syarat drive diperlukan untuk navigasi, menormalkan jalur relatif, memindahkan item penyimpanan data, serta metode yang mendapatkan nama turunan, mendapatkan jalur induk item, dan menguji untuk mengidentifikasi apakah item adalah kontainer.
Perhatian
Ketahuilah bahwa desain ini mengasumsikan database yang memiliki bidang dengan ID nama, dan jenis bidangnya adalah LongInteger.
Menentukan penyedia Windows PowerShell
Penyedia navigasi Windows PowerShell harus membuat kelas .NET yang berasal dari kelas dasar System.Management.Automation.Provider.NavigationCmdletProvider . Berikut adalah definisi kelas untuk penyedia navigasi yang dijelaskan di bagian ini.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
Perhatikan bahwa dalam penyedia 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 Desain Penyedia PS Anda, kelas dasar System.Management.Automation.Provider.NavigationCmdletProvider berasal dari beberapa kelas lain yang menyediakan fungsionalitas penyedia yang berbeda. Oleh karena itu, penyedia navigasi Windows PowerShell harus 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 PS 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 melalui drive Windows PowerShell, Anda harus menerapkan 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.
Untuk membuka item turunan, atau namanya, dari penyimpanan data, serta metode yang membuat, menyalin, mengganti nama, dan menghapus item, Anda harus menerapkan metode yang disediakan oleh kelas dasar System.Management.Automation.Provider.ContainerCmdletProvider . Untuk informasi selengkapnya tentang menerapkan metode ini, lihat Membuat Penyedia Kontainer Windows PowerShell.
Membuat Jalur Windows PowerShell
Penyedia navigasi Windows PowerShell menggunakan jalur Windows PowerShell internal penyedia untuk menavigasi item penyimpanan data. Untuk membuat jalur internal penyedia, penyedia harus mengimplementasikan metode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* untuk mendukung panggilan dari cmdlet Combine-Path. Metode ini menggabungkan jalur induk dan anak ke dalam jalur internal penyedia, menggunakan pemisah jalur khusus penyedia antara jalur induk dan turunan.
Implementasi default mengambil jalur dengan "/" atau "\" sebagai pemisah jalur, menormalkan pemisah jalur ke "\", menggabungkan bagian jalur induk dan anak dengan pemisah di antara keduanya, lalu mengembalikan string yang berisi jalur gabungan.
Penyedia navigasi ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default dari metode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*.
Hal yang Perlu Diingat Tentang Menerapkan MakePath
Ketentuan berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:
Implementasi metode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* Anda tidak boleh memvalidasi jalur sebagai jalur legal yang memenuhi syarat sepenuhnya di namespace penyedia. Ketahuilah bahwa setiap parameter hanya dapat mewakili bagian dari jalur, dan bagian gabungan mungkin tidak menghasilkan jalur yang memenuhi syarat sepenuhnya. Misalnya, metode System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* untuk penyedia FileSystem mungkin menerima "windows\system32" dalam
parentparameter dan "abc.dll" dalamchildparameter. Metode ini menggabungkan nilai-nilai ini dengan pemisah "\" dan mengembalikan "windows\system32\abc.dll", yang bukan merupakan jalur sistem file yang memenuhi syarat sepenuhnya.Penting
Bagian jalur yang disediakan dalam panggilan ke System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* mungkin berisi karakter yang tidak diizinkan di namespace penyedia. Karakter ini kemungkinan besar digunakan untuk ekspansi wildcard dan penerapan metode ini tidak boleh menghapusnya.
Mengambil Jalur Induk
Penyedia navigasi Windows PowerShell mengimplementasikan metode System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* untuk mengambil bagian induk dari jalur khusus penyedia penuh atau sebagian yang ditunjukkan. Metode ini menghapus bagian turunan dari jalur dan mengembalikan bagian jalur induk. Parameter menentukan root jalur yang sepenuhnya memenuhi syarat ke akar drive. Parameter ini dapat null atau kosong jika drive yang dipasang tidak digunakan untuk operasi pengambilan. Jika akar ditentukan, metode harus mengembalikan jalur ke kontainer di pohon yang sama dengan akar.
Penyedia navigasi sampel tidak mengganti metode ini, tetapi menggunakan implementasi default. Ini menerima jalur yang menggunakan "/" dan "\" sebagai pemisah jalur. Pertama-tama menormalkan jalur untuk hanya memiliki pemisah "\", lalu memisahkan jalur induk pada "\" terakhir dan mengembalikan jalur induk.
Perlu Diingat Tentang Menerapkan GetParentPath
Implementasi Anda dari metode System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* harus membagi jalur secara leksikal pada pemisah jalur untuk namespace penyedia. Misalnya, penyedia FileSystem menggunakan metode ini untuk mencari "\" terakhir dan mengembalikan semuanya ke kiri pemisah.
Mengambil nama jalur turunan
Penyedia navigasi Anda mengimplementasikan metode System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* untuk mengambil nama (elemen daun) turunan item yang terletak di jalur khusus penyedia penuh atau sebagian yang ditunjukkan.
Penyedia navigasi sampel tidak mengganti metode ini. Implementasi default ditunjukkan di bawah ini. Ini menerima jalur yang menggunakan "/" dan "\" sebagai pemisah jalur. Pertama-tama menormalkan jalur untuk hanya memiliki pemisah "\", kemudian memisahkan jalur induk pada "\" terakhir dan mengembalikan nama bagian jalur turunan.
Hal yang Perlu Diingat Tentang Menerapkan GetChildName
Implementasi Anda dari metode System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* harus membagi jalur secara leksikal pada pemisah jalur. Jika jalur yang disediakan tidak berisi pemisah jalur, metode harus mengembalikan jalur yang tidak dimodifikasi.
Penting
Jalur yang disediakan dalam panggilan ke metode ini mungkin berisi karakter yang ilegal di namespace penyedia. Karakter ini kemungkinan besar digunakan untuk ekspansi karakter pengganti atau pencocokan ekspresi reguler, dan penerapan metode ini tidak boleh menghapusnya.
Menentukan apakah Item adalah Kontainer
Penyedia navigasi dapat mengimplementasikan metode System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* untuk menentukan apakah jalur yang ditentukan menunjukkan kontainer. Ini mengembalikan true jika jalur mewakili kontainer, dan false sebaliknya. Pengguna memerlukan metode ini untuk dapat menggunakan Test-Path cmdlet untuk jalur yang disediakan.
Kode berikut menunjukkan implementasi System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* dalam contoh penyedia navigasi kami. Metode ini memverifikasi bahwa jalur yang ditentukan benar dan jika tabel ada, dan mengembalikan true jika jalur menunjukkan 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;
} // IsItemContainer
Hal yang Perlu Diingat Tentang Menerapkan IsItemContainer
Kelas .NET penyedia navigasi Anda mungkin mendeklarasikan kemampuan penyedia ExpandWildcards, Filter, Include, atau Exclude, dari enumerasi System.Management.Automation.Provider.ProviderCapabilities . Dalam hal ini, implementasi System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* perlu memastikan bahwa jalur yang dilewati memenuhi persyaratan. Untuk melakukan ini, metode harus mengakses properti yang sesuai, misalnya, properti System.Management.Automation.Provider.CmdletProvider.Exclude*.
Memindahkan Item
Untuk mendukung Move-Item cmdlet, penyedia navigasi Anda mengimplementasikan metode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*. Metode ini memindahkan item yang ditentukan oleh path parameter ke kontainer pada jalur yang disediakan dalam destination parameter.
Penyedia navigasi sampel tidak mengganti metode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem*. Berikut ini adalah implementasi default.
Hal yang Perlu Diingat Tentang Menerapkan MoveItem
Kelas .NET penyedia navigasi Anda mungkin mendeklarasikan kemampuan penyedia ExpandWildcards, Filter, Include, atau Exclude, dari enumerasi System.Management.Automation.Provider.ProviderCapabilities . Dalam hal ini, implementasi System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* harus memastikan bahwa jalur yang dilewati memenuhi persyaratan. Untuk melakukan ini, metode harus mengakses properti yang sesuai, misalnya, properti CmdletProvider.Exclude .
Secara default, penggantian metode ini tidak boleh memindahkan objek ke 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:\bar.txt yang ada kecuali properti System.Management.Automation.Provider.CmdletProvider.Force* diatur ke true. Jika jalur yang ditentukan dalam destination parameter ada dan merupakan kontainer, properti System.Management.Automation.Provider.CmdletProvider.Force* tidak diperlukan. Dalam hal ini, System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* harus memindahkan item yang ditunjukkan oleh path parameter ke kontainer yang ditunjukkan oleh destination parameter sebagai turunan.
Implementasi Anda dari metode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* harus memanggil System.Management.Automation.Provider.CmdletProvider.ShouldProcess dan memeriksa nilai yang ditampilkan sebelum membuat perubahan apa pun pada penyimpanan data. Metode ini digunakan untuk mengonfirmasi eksekusi operasi ketika perubahan dilakukan pada status sistem, misalnya, menghapus 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 kepada pengguna.
Setelah panggilan ke System.Management.Automation.Provider.CmdletProvider.ShouldProcess mengembalikan true, metode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* harus memanggil metode System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Metode ini mengirimkan pesan ke pengguna untuk mengizinkan umpan balik untuk mengatakan apakah operasi harus dilanjutkan. Penyedia Anda harus memanggil System.Management.Automation.Provider.CmdletProvider.ShouldContinue sebagai pemeriksaan tambahan untuk modifikasi sistem yang berpotensi berbahaya.
Melampirkan Parameter Dinamis ke Cmdlet Move-Item
Terkadang Move-Item cmdlet memerlukan parameter tambahan yang disediakan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia navigasi harus mengimplementasikan metode System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* untuk mendapatkan nilai parameter yang diperlukan dari 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 .
Penyedia navigasi ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.
Menormalkan Jalur Relatif
Penyedia navigasi Anda mengimplementasikan metode System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* untuk menormalkan jalur yang sepenuhnya memenuhi syarat yang ditunjukkan dalam path parameter sebagai relatif terhadap jalur yang ditentukan oleh basePath parameter. Metode ini mengembalikan representasi string dari jalur yang dinormalisasi. Ini menulis kesalahan jika path parameter menentukan jalur yang tidak ada.
Penyedia navigasi sampel tidak mengganti metode ini. Berikut ini adalah implementasi default.
Hal-hal yang Perlu Diingat Tentang Menerapkan NormalizeRelativePath
Implementasi System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* harus mengurai path parameter, tetapi tidak harus menggunakan penguraian sintaksis murni. Anda dianjurkan untuk merancang metode ini untuk menggunakan jalur untuk mencari informasi jalur di penyimpanan data dan membuat jalur yang cocok dengan huruf besar dan sintaks jalur standar.
Sampel Kode
Untuk kode sampel lengkap, lihat Sampel Kode AccessDbProviderSample05.
Menentukan Jenis Objek dan Pemformatan
Dimungkinkan bagi penyedia untuk menambahkan anggota ke objek yang ada atau menentukan objek baru. Untuk informasi selengkapnya, lihatMemperluas Jenis dan Pemformatan Objek.
Membangun penyedia Windows PowerShell
Untuk informasi selengkapnya, 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, termasuk cmdlet yang tersedia dengan derivasi. Contoh ini akan menguji penyedia navigasi sampel.
Jalankan shell baru Anda dan gunakan
Set-Locationcmdlet untuk mengatur jalur untuk menunjukkan database Access.Set-Location mydb:Sekarang jalankan
Get-ChildItemcmdlet untuk mengambil daftar item database, yang merupakan tabel database yang tersedia. Untuk setiap tabel, cmdlet ini juga mengambil jumlah baris tabel.Get-ChildItem | Format-Table RowCount, Name -AutoSizeRowCount Name -------- ---- 180 MSysAccessObjects 0 MSysACEs 1 MSysCmdbars 0 MSysIMEXColumns 0 MSysIMEXSpecs 0 MSysObjects 0 MSysQueries 7 MSysRelationships 8 Categories 91 Customers 9 Employees 2155 Order Details 830 Orders 77 Products 3 Shippers 29 SuppliersGunakan
Set-Locationcmdlet lagi untuk mengatur lokasi tabel data Karyawan.Set-Location EmployeesSekarang mari kita gunakan
Get-Locationcmdlet untuk mengambil jalur ke tabel Karyawan.Get-LocationPath ---- mydb:\EmployeesSekarang gunakan cmdlet yang
Get-ChildItemdisalurkan keFormat-Tablecmdlet. Kumpulan cmdlet ini mengambil item untuk tabel data Karyawan, yang merupakan baris tabel. Mereka diformat seperti yang ditentukan olehFormat-Tablecmdlet.Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSizeRowNumber PSIsContainer Data --------- -------------- ---- 0 False System.Data.DataRow 1 False System.Data.DataRow 2 False System.Data.DataRow 3 False System.Data.DataRow 4 False System.Data.DataRow 5 False System.Data.DataRow 6 False System.Data.DataRow 7 False System.Data.DataRow 8 False System.Data.DataRowAnda sekarang dapat menjalankan
Get-Itemcmdlet untuk mengambil item untuk baris 0 tabel data Karyawan.Get-Item 0PSPath : AccessDB::C:\PS\Northwind.mdb\Employees\0 PSParentPath : AccessDB::C:\PS\Northwind.mdb\Employees PSChildName : 0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Gunakan
Get-Itemcmdlet lagi untuk mengambil data karyawan untuk item di baris 0.(Get-Item 0).DataEmployeeID : 1 LastName : Davis FirstName : Sara Title : Sales Representative TitleOfCourtesy : Ms. BirthDate : 12/8/1968 12:00:00 AM HireDate : 5/1/1992 12:00:00 AM Address : 4567 Main Street Apt. 2A City : Buffalo Region : NY PostalCode : 98052 Country : USA HomePhone : (206) 555-9857 Extension : 5467 Photo : EmpID1.bmp Notes : Education includes a BA in psychology from Colorado State University. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International. ReportsTo : 2
Lihat Juga
Membuat penyedia Windows PowerShell
Rancang Penyedia Windows PowerShell Anda
Memperluas Jenis Objek dan Pemformatan
Menerapkan penyedia PowerShell Windows Kontainer
Cara Mendaftarkan Cmdlet, Penyedia, dan Aplikasi Host