ค้นหาเว็บไซต์

การเขียนผู้ให้บริการรายการ


หัวข้อนี้อธิบายวิธีการใช้วิธีการของผู้ให้บริการ Windows PowerShell ที่เข้าถึงและจัดการรายการต่างๆ ในที่เก็บข้อมูล เพื่อให้สามารถเข้าถึงรายการต่างๆ ผู้ให้บริการจะต้องได้รับมาจากคลาส System.Management.Automation.Provider.Itemcmdletprovider

ผู้ให้บริการในตัวอย่างในหัวข้อนี้ใช้ฐานข้อมูล Access เป็นที่เก็บข้อมูล มีวิธีช่วยเหลือและคลาสต่างๆ มากมายที่ใช้ในการโต้ตอบกับฐานข้อมูล สำหรับตัวอย่างที่สมบูรณ์ที่มีวิธีการช่วยเหลือ โปรดดูที่ AccessDBProviderSample03

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับผู้ให้บริการ Windows PowerShell ดูภาพรวมผู้ให้บริการ Windows PowerShell

การใช้วิธีการรายการ

คลาส System.Management.Automation.Provider.Itemcmdletprovider แสดงวิธีการต่างๆ ที่สามารถใช้เพื่อเข้าถึงและจัดการรายการในที่เก็บข้อมูล สำหรับรายการทั้งหมดของวิธีการเหล่านี้ โปรดดูที่วิธี ItemCmdletProvider ในตัวอย่างนี้ เราจะใช้สี่วิธีเหล่านี้ System.Management.Automation.Provider.Itemcmdletprovider.Getitem* ได้รับสินค้าในเส้นทางที่ระบุ System.Management.Automation.Provider.Itemcmdletprovider.Setitem* ตั้งค่าของรายการที่ระบุ System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* ตรวจสอบว่ามีรายการอยู่ในเส้นทางที่ระบุหรือไม่ System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath* ตรวจสอบเส้นทางเพื่อดูว่าแมปไปยังตำแหน่งในที่เก็บข้อมูลหรือไม่

บันทึก

หัวข้อนี้สร้างจากข้อมูลใน QuickStart ของผู้ให้บริการ Windows PowerShell หัวข้อนี้ไม่ครอบคลุมพื้นฐานของวิธีการตั้งค่าโครงการของผู้ให้บริการ หรือวิธีการใช้วิธีการที่สืบทอดมาจากคลาส System.Management.Automation.Provider.Drivecmdletprovider ที่สร้างและลบไดรฟ์

ประกาศคลาสผู้ให้บริการ

ประกาศผู้ให้บริการที่จะสืบทอดมาจากคลาส System.Management.Automation.Provider.Itemcmdletprovider และตกแต่งด้วย System.Management.Automation.Provider.Cmdletproviderattribute

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

   public class AccessDBProvider : ItemCmdletProvider
   {

  }

การใช้งาน GetItem

System.Management.Automation.Provider.Itemcmdletprovider.Getitem* ถูกเรียกโดยกลไกจัดการ PowerShell เมื่อผู้ใช้เรียก Microsoft.PowerShell.Commands.GetItemCommand cmdlet บนผู้ให้บริการของคุณ วิธีการส่งคืนสินค้าตามเส้นทางที่ระบุ ในตัวอย่างฐานข้อมูล Access วิธีการจะตรวจสอบว่ารายการนั้นเป็นไดรฟ์ ตารางในฐานข้อมูล หรือแถวในฐานข้อมูล วิธีการส่งสินค้าไปยังกลไกจัดการ PowerShell โดยการเรียกเมธอด 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);
           }

       }

การใช้ SetItem

เมธอด System.Management.Automation.Provider.Itemcmdletprovider.Setitem* ถูกเรียกโดยกลไกจัดการ PowerShell เมื่อผู้ใช้เรียก Microsoft.PowerShell.Commands.SetItemCommand cmdlet มันตั้งค่าของรายการตามเส้นทางที่ระบุ

ในตัวอย่างฐานข้อมูล Access เหมาะสมที่จะตั้งค่าของรายการเฉพาะในกรณีที่รายการนั้นเป็นแถว ดังนั้นเมธอดจะส่ง NotSupportedException เมื่อรายการนั้นไม่ใช่แถว

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

       }

กำลังดำเนินการ ItemExists

วิธีการ System.Management.Automation.Provider.Itemcmdletprovider.Itemexists* ถูกเรียกโดยกลไกจัดการ PowerShell เมื่อผู้ใช้เรียก Microsoft.PowerShell.Commands.TestPathCommand cmdlet วิธีการกำหนดว่ามีสินค้าอยู่ในเส้นทางที่ระบุหรือไม่ หากมีสินค้าอยู่ วิธีการจะส่งกลับไปยังกลไกจัดการ PowerShell โดยการเรียก 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;

       }

การใช้งาน IsValidPath

เมธอด System.Management.Automation.Provider.Itemcmdletprovider.Isvalidpath* ตรวจสอบว่าเส้นทางที่ระบุถูกต้องตามหลักไวยากรณ์สำหรับผู้ให้บริการปัจจุบันหรือไม่ ไม่ได้ตรวจสอบว่ามีรายการอยู่ที่เส้นทางหรือไม่

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

ขั้นตอนต่อไป

ผู้ให้บริการในโลกแห่งความเป็นจริงโดยทั่วไปสามารถรองรับรายการที่มีรายการอื่น และการย้ายรายการจากเส้นทางหนึ่งไปยังอีกเส้นทางหนึ่งภายในไดรฟ์ สำหรับตัวอย่างของผู้ให้บริการที่รองรับคอนเทนเนอร์ โปรดดูที่ การเขียนผู้ให้บริการคอนเทนเนอร์ สำหรับตัวอย่างผู้ให้บริการที่รองรับรายการเคลื่อนย้าย โปรดดูที่ การเขียนผู้ให้บริการนำทาง

ดูเพิ่มเติม

การเขียนผู้ให้บริการคอนเทนเนอร์

การเขียนผู้ให้บริการนำทาง

ภาพรวมผู้ให้บริการ Windows PowerShell

บทความที่เกี่ยวข้อง