การเขียนผู้ให้บริการรายการ
หัวข้อนี้อธิบายวิธีการใช้วิธีการของผู้ให้บริการ 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