Bagikan melalui


Menulis penyedia item

Topik ini menjelaskan cara menerapkan metode penyedia Windows PowerShell yang mengakses dan memanipulasi item di penyimpanan data. Agar dapat mengakses item, penyedia harus berasal dari kelas System.Management.Automation.Provider.ItemCmdletProvider.

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 AccessDBProviderSample03

Untuk informasi selengkapnya tentang penyedia Windows PowerShell, lihat Gambaran Umum Penyedia Windows PowerShell.

Menerapkan metode item

Kelas System.Management.Automation.Provider.ItemCmdletProvider mengekspos beberapa metode yang dapat digunakan untuk mengakses dan memanipulasi item di penyimpanan data. Untuk daftar lengkap metode ini, lihat Metode ItemCmdletProvider. Dalam contoh ini, kami akan menerapkan empat metode ini. System.Management.Automation.Provider.ItemCmdletProvider.GetItem* mendapatkan item di jalur tertentu. System.Management.Automation.Provider.ItemCmdletProvider.SetItem* menetapkan nilai item yang ditentukan. System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* memeriksa apakah item ada di jalur yang ditentukan. System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath* memeriksa jalur untuk melihat apakah jalur tersebut memetakan ke lokasi di penyimpanan data.

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.

Mendeklarasikan kelas penyedia

Deklarasikan penyedia untuk berasal dari kelas System.Management.Automation.Provider.ItemCmdletProvider, dan hiasi dengan System.Management.Automation.Provider.CmdletProviderAttribute.

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

   public class AccessDBProvider : ItemCmdletProvider
   {

  }

Menerapkan GetItem

System.Management.Automation.Provider.ItemCmdletProvider.GetItem* dipanggil oleh mesin PowerShell saat pengguna memanggil cmdlet Microsoft.PowerShell.Commands.GetItemCommand pada penyedia Anda. Metode mengembalikan item pada jalur yang ditentukan. Dalam contoh database Access, metode memeriksa apakah item adalah drive itu sendiri, tabel dalam database, atau baris dalam database. Metode mengirim item ke mesin PowerShell dengan memanggil metode System.Management.Automation.Provider.CmdletProvider.WriteItemObject*.

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

       }

Menerapkan SetItem

Metode System.Management.Automation.Provider.ItemCmdletProvider.SetItem* dipanggil oleh panggilan mesin PowerShell saat pengguna memanggil cmdlet Microsoft.PowerShell.Commands.SetItemCommand. Ini mengatur nilai item pada jalur yang ditentukan.

Dalam contoh database Access, masuk akal untuk mengatur nilai item hanya jika item tersebut adalah baris, sehingga metode melemparkan NotSupportedException ketika item bukan baris.

protected override void SetItem(string path, object values)
       {
           // Get type, table name and row number from the path specified
           string tableName;
           int rowNumber;

           PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

           if (type != PathType.Row)
           {
               WriteError(new ErrorRecord(new NotSupportedException(
                     "SetNotSupported"), "",
                  ErrorCategory.InvalidOperation, path));

               return;
           }

           // Get in-memory representation of table
           OdbcDataAdapter da = GetAdapterForTable(tableName);

           if (da == null)
           {
               return;
           }
           DataSet ds = GetDataSetForTable(da, tableName);
           DataTable table = GetDataTable(ds, tableName);

           if (rowNumber >= table.Rows.Count)
           {
               // The specified row number has to be available. If not
               // NewItem has to be used to add a new row
               throw new ArgumentException("Row specified is not available");
           } // if (rowNum...

           string[] colValues = (values as string).Split(',');

           // set the specified row
           DataRow row = table.Rows[rowNumber];

           for (int i = 0; i < colValues.Length; i++)
           {
               row[i] = colValues[i];
           }

           // Update the table
           if (ShouldProcess(path, "SetItem"))
           {
               da.Update(ds, tableName);
           }

       }

Menerapkan ItemExists

Metode System.Management.Automation.Provider.ItemCmdletProvider.ItemExists* dipanggil oleh mesin PowerShell saat pengguna memanggil cmdlet Microsoft.PowerShell.Commands.TestPathCommand. Metode menentukan apakah ada item di jalur yang ditentukan. Jika item memang ada, metode meneruskannya kembali ke mesin PowerShell dengan memanggil System.Management.Automation.Provider.CmdletProvider.WriteItemObject*.

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;

       }

Menerapkan IsValidPath

Metode System.Management.Automation.Provider.ItemCmdletProvider.IsValidPath* memeriksa apakah jalur yang ditentukan valid secara sinkron untuk penyedia saat ini. Ini tidak memeriksa apakah item ada di jalur.

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

Langkah berikutnya

Penyedia dunia nyata yang khas mampu mendukung item yang berisi item lain, dan memindahkan item dari satu jalur ke jalur lain dalam drive. Untuk contoh penyedia yang mendukung kontainer, lihat Menulis penyedia kontainer. Untuk contoh penyedia yang mendukung pemindahan item, lihat Menulis penyedia navigasi.

Lihat Juga

Menulis penyedia kontainer

Menulis penyedia navigasi

Gambaran Umum Penyedia Windows PowerShell