Bagikan melalui


Membuat Penyedia Navigasi Windows PowerShell

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*:

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.

  1. Jalankan shell baru Anda dan gunakan Set-Location cmdlet untuk mengatur jalur untuk menunjukkan database Access.

    Set-Location mydb:
    
  2. Sekarang jalankan Get-ChildItem cmdlet 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 -AutoSize
    
    RowCount   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   Suppliers
    
  3. Gunakan Set-Location cmdlet lagi untuk mengatur lokasi tabel data Karyawan.

    Set-Location Employees
    
  4. Sekarang mari kita gunakan Get-Location cmdlet untuk mengambil jalur ke tabel Karyawan.

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. Sekarang gunakan cmdlet yang Get-ChildItem disalurkan ke Format-Table cmdlet. Kumpulan cmdlet ini mengambil item untuk tabel data Karyawan, yang merupakan baris tabel. Mereka diformat seperti yang ditentukan oleh Format-Table cmdlet.

    Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSize
    
    RowNumber   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.DataRow
    
  6. Anda sekarang dapat menjalankan Get-Item cmdlet untuk mengambil item untuk baris 0 tabel data Karyawan.

    Get-Item 0
    
    PSPath        : 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      : 0
    
  7. Gunakan Get-Item cmdlet lagi untuk mengambil data karyawan untuk item di baris 0.

    (Get-Item 0).Data
    
    EmployeeID      : 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

Panduan Pemrogram Windows PowerShell

Windows PowerShell SDK