Bagikan melalui


Membuat penyedia item Windows PowerShell

Topik ini menjelaskan cara membuat penyedia Windows PowerShell yang dapat memanipulasi data dalam penyimpanan data. Dalam topik ini, elemen data di penyimpanan disebut sebagai "item" penyimpanan data. Akibatnya, penyedia yang dapat memanipulasi data di penyimpanan disebut sebagai penyedia item Windows PowerShell.

Nota

Anda dapat mengunduh file sumber C# (AccessDBSampleProvider03.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 PowerShell Samples direktori. Untuk informasi selengkapnya tentang implementasi penyedia Windows PowerShell lainnya, lihat Merancang Penyedia Windows PowerShell Anda.

Penyedia item Windows PowerShell yang dijelaskan dalam topik ini mendapatkan item data dari database Access. Dalam hal ini, "item" adalah tabel dalam database Access atau baris dalam tabel.

Menentukan kelas penyedia item Windows PowerShell

Penyedia item Windows PowerShell harus menentukan kelas .NET yang berasal dari kelas dasar System.Management.Automation.Provider.ItemCmdletProvider . Berikut ini adalah definisi kelas untuk penyedia item yang dijelaskan di bagian ini.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]

public class AccessDBProvider : ItemCmdletProvider

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.DriveCmdletProvider berasal dari beberapa kelas lain yang menyediakan fungsionalitas penyedia yang berbeda. Oleh karena itu, penyedia item Windows PowerShell harus menentukan semua fungsionalitas yang disediakan oleh kelas tersebut.

Untuk informasi selengkapnya tentang cara 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.

Sebelum penyedia item Windows PowerShell dapat memanipulasi item di penyimpanan, penyedia item Windows harus menerapkan metode kelas dasar System.Management.Automation.Provider.DriveCmdletProvider untuk mengakses ke penyimpanan data. Untuk informasi selengkapnya tentang menerapkan kelas ini, lihat Membuat Penyedia Drive Windows PowerShell.

Memeriksa validitas jalur

Saat mencari item data, runtime Windows PowerShell menyediakan jalur Windows PowerShell ke penyedia, seperti yang didefinisikan di bagian "Konsep PSPath" dari Cara Kerja Windows PowerShell. Penyedia item Windows PowerShell harus memverifikasi validitas sintaksis dan semantik dari jalur apa pun yang diteruskan ke jalur tersebut dengan menerapkan metode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath . Metode ini mengembalikan true jika jalur valid, dan false sebaliknya. Ketahuilah bahwa implementasi metode ini tidak boleh memverifikasi keberadaan item di jalur, tetapi hanya bahwa jalur tersebut benar secara sintaksis dan semantik.

Berikut adalah implementasi metode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath untuk penyedia ini. Perhatikan bahwa implementasi ini memanggil metode pembantu NormalizePath untuk mengonversi semua pemisah di jalur menjadi yang seragam.

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;
} // IsValidPath

Menentukan apakah item ada

Setelah memverifikasi jalur, runtime Windows PowerShell harus menentukan apakah item data ada di jalur tersebut. Untuk mendukung jenis kueri ini, penyedia item Windows PowerShell mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists . Metode ini mengembalikan true item ditemukan di jalur yang ditentukan dan false (default) sebaliknya.

Berikut adalah implementasi metode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists untuk penyedia ini. Perhatikan bahwa metode ini memanggil metode pembantu PathIsDrive, ChunkPath, dan GetTable , dan menggunakan objek DatabaseTableInfo yang ditentukan penyedia.

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;

} // ItemExists

Hal-hal yang perlu diingat tentang penerapan ItemExists

Kondisi berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ItemCmdletProvider.ItemExists:

Melampirkan parameter dinamis ke cmdlet Test-Path

Terkadang Test-Path cmdlet yang memanggil System.Management.Automation.Provider.ItemCmdletProvider.ItemExists memerlukan parameter tambahan yang ditentukan secara dinamis saat runtime. Untuk menyediakan parameter dinamis ini, penyedia item Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.ItemExistsDynamicParameters. 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 Test-Path cmdlet.

Penyedia item Windows PowerShell ini tidak mengimplementasikan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.

Mengambil item

Untuk mengambil item, penyedia item Windows PowerShell harus mengganti metode System.Management.Automation.Provider.ItemCmdletProvider.GetItem untuk mendukung panggilan dari Get-Item cmdlet. Metode ini menulis item menggunakan metode System.Management.Automation.Provider.CmdletProvider.WriteItemObject .

Berikut adalah implementasi metode System.Management.Automation.Provider.ItemCmdletProvider.GetItem untuk penyedia ini. Perhatikan bahwa metode ini menggunakan metode pembantu GetTable dan GetRow untuk mengambil item yang merupakan tabel dalam database Access atau baris dalam tabel data.

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);
     }

 } // GetItem

Hal-hal yang perlu diingat tentang menerapkan GetItem

Ketentuan berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ItemCmdletProvider.GetItem:

Melampirkan parameter dinamis ke cmdlet Get-Item

Terkadang Get-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia item Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.GetItemDynamicParameters. 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-Item cmdlet.

Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.

Mengatur item

Untuk mengatur item, penyedia item Windows PowerShell harus mengganti metode System.Management.Automation.Provider.ItemCmdletProvider.SetItem untuk mendukung panggilan dari Set-Item cmdlet. Metode ini mengatur nilai item pada jalur yang ditentukan.

Penyedia ini tidak menyediakan penggantian untuk metode System.Management.Automation.Provider.ItemCmdletProvider.SetItem . Namun, berikut ini adalah implementasi default dari metode ini.

Hal-hal yang perlu diingat tentang menerapkan SetItem

Kondisi berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ItemCmdletProvider.SetItem:

Mengambil parameter dinamis untuk SetItem

Terkadang Set-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia item Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.SetItemDynamicParameters. 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 Set-Item cmdlet.

Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.

Menghapus item

Untuk menghapus item, penyedia item Windows PowerShell mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.ClearItem untuk mendukung panggilan dari Clear-Item cmdlet. Metode ini menghapus item data pada jalur yang ditentukan.

Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.

Hal-hal yang perlu diingat tentang menerapkan ClearItem

Kondisi berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ItemCmdletProvider.ClearItem:

Mengambil parameter dinamis untuk ClearItem

Terkadang Clear-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia item Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.ClearItemDynamicParameters. 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 Clear-Item cmdlet.

Penyedia item ini tidak mengimplementasikan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.

Melakukan tindakan default untuk item

Penyedia item Windows PowerShell dapat mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction untuk mendukung panggilan dari Invoke-Item cmdlet, yang memungkinkan penyedia melakukan tindakan default untuk item pada jalur yang ditentukan. Misalnya, penyedia FileSystem mungkin menggunakan metode ini untuk memanggil ShellExecute untuk item tertentu.

Penyedia ini tidak menerapkan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.

Hal-hal yang perlu diingat tentang penerapan InvokeDefaultAction

Kondisi berikut mungkin berlaku untuk implementasi System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultAction:

Mengambil parameter dinamis untuk InvokeDefaultAction

Terkadang Invoke-Item cmdlet memerlukan parameter tambahan yang ditentukan secara dinamis pada runtime. Untuk menyediakan parameter dinamis ini, penyedia item Windows PowerShell harus mengimplementasikan metode System.Management.Automation.Provider.ItemCmdletProvider.InvokeDefaultActionDynamicParameters. 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 dinamis ke Invoke-Item cmdlet.

Penyedia item ini tidak mengimplementasikan metode ini. Namun, kode berikut adalah implementasi default dari metode ini.

Menerapkan metode dan kelas pembantu

Penyedia item ini mengimplementasikan beberapa metode dan kelas pembantu yang digunakan oleh metode penggantian publik yang ditentukan oleh Windows PowerShell. Kode untuk metode dan kelas pembantu ini ditampilkan di bagian Sampel Kode .

Metode NormalizePath

Penyedia item ini mengimplementasikan metode pembantu NormalizePath untuk memastikan bahwa jalur memiliki format yang konsisten. Format yang ditentukan menggunakan garis miring terbalik (\) sebagai pemisah.

Metode PathIsDrive

Penyedia item ini mengimplementasikan metode pembantu PathIsDrive untuk menentukan apakah jalur yang ditentukan sebenarnya adalah nama drive.

Metode ChunkPath

Penyedia item ini mengimplementasikan metode pembantu ChunkPath yang memecah jalur yang ditentukan sehingga penyedia dapat mengidentifikasi elemen individualnya. Ini mengembalikan array yang terdiri dari elemen jalur.

Metode GetTable

Penyedia item ini mengimplementasikan metode pembantu GetTables yang mengembalikan objek DatabaseTableInfo yang mewakili informasi tentang tabel yang ditentukan dalam panggilan.

Metode GetRow

Metode System.Management.Automation.Provider.ItemCmdletProvider.GetItem dari penyedia item ini memanggil metode pembantu GetRows. Metode pembantu ini mengambil objek DatabaseRowInfo yang mewakili informasi tentang baris yang ditentukan dalam tabel.

DatabaseTableInfo

Penyedia item ini mendefinisikan kelas DatabaseTableInfo yang mewakili kumpulan informasi dalam tabel data dalam database. Kelas ini mirip dengan kelas System.IO.Directoryinfo.

Penyedia item sampel menentukan metode DatabaseTableInfo.GetTables yang mengembalikan kumpulan objek informasi tabel yang menentukan tabel dalam database. Metode ini menyertakan blok try/catch untuk memastikan bahwa setiap kesalahan database muncul sebagai baris dengan nol entri.

DatabaseRowInfo

Penyedia item ini mendefinisikan kelas pembantu DatabaseRowInfo yang mewakili baris dalam tabel database. Kelas ini mirip dengan kelas System.IO.FileInfo .

Penyedia sampel mendefinisikan metode DatabaseRowInfo.GetRows untuk mengembalikan kumpulan objek informasi baris untuk tabel yang ditentukan. Metode ini mencakup blok try/catch untuk menjebak pengecualian. Kesalahan apa pun tidak akan menghasilkan informasi baris.

Sampel kode

Untuk kode sampel lengkap, lihat Sampel Kode AccessDbProviderSample03.

Mendefinisikan jenis objek dan pemformatan

Saat menulis penyedia, mungkin perlu menambahkan anggota ke objek yang ada atau menentukan objek baru. Setelah selesai, buat file Jenis yang dapat digunakan Windows PowerShell untuk mengidentifikasi anggota objek dan file Format yang menentukan bagaimana objek ditampilkan. Untuk informasi selengkapnya, lihat Memperluas Jenis dan Pemformatan Objek.

Membangun penyedia Windows PowerShell

Lihat Cara mendaftarkan cmdlet, penyedia, dan aplikasi host.

Menguji penyedia Windows PowerShell

Ketika penyedia item Windows PowerShell ini terdaftar dengan Windows PowerShell, Anda hanya dapat menguji fungsionalitas dasar dan drive penyedia. Untuk menguji manipulasi item, Anda juga harus mengimplementasikan fungsionalitas kontainer yang dijelaskan dalam Menerapkan Penyedia PowerShell Windows Kontainer.

Lihat juga