当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 创建 Windows PowerShell 导航提供程序

作者:精品下载站 日期:2024-12-14 02:29:56 浏览:15 分类:玩电脑

创建 Windows PowerShell 导航提供程序


本主题介绍如何创建可以导航数据存储的 Windows PowerShell 导航提供程序。这种类型的提供程序支持递归命令、嵌套容器和相对路径。

笔记

您可以使用适用于 Windows Vista 和 .NET Framework 3.0 运行时组件的 Microsoft Windows 软件开发工具包下载此提供程序的 C# 源文件 (AccessDBSampleProvider05.cs)。有关下载说明,请参阅如何安装 Windows PowerShell 和下载 Windows PowerShell SDK。下载的源文件位于 目录中。有关其他 Windows PowerShell 提供程序实现的详细信息,请参阅设计 Windows PowerShell 提供程序。

这里描述的提供程序使用户能够将 Access 数据库作为驱动器来处理,以便用户可以导航到数据库中的数据表。创建自己的导航提供程序时,您可以实现一些方法,这些方法可以创建导航所需的驱动器限定路径、标准化相对路径、移动数据存储的项目,以及获取子名称、获取项目的父路径的方法,并测试以确定一个项目是否是一个容器。

警告

请注意,此设计假设数据库有一个名为 ID 的字段,并且该字段的类型为 LongInteger。

定义 Windows PowerShell 提供程序

Windows PowerShell 导航提供程序必须创建派生自 System.Management.Automation.Provider.Navigationcmdletprovider 基类的 .NET 类。以下是本节中描述的导航提供程序的类定义。

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider

请注意,在此提供程序中,System.Management.Automation.Provider.Cmdletproviderattribute 属性包括两个参数。第一个参数指定 Windows PowerShell 使用的提供程序的用户友好名称。第二个参数指定提供程序在命令处理期间向 Windows PowerShell 运行时公开的 Windows PowerShell 特定功能。对于此提供程序,没有添加任何 Windows PowerShell 特定功能。

定义基本功能

如设计您的 PS 提供程序中所述,System.Management.Automation.Provider.Navigationcmdletprovider 基类派生自提供不同提供程序功能的其他几个类。因此,Windows PowerShell 导航提供程序必须定义这些类提供的所有功能。

要实现添加特定于会话的初始化信息和释放提供程序使用的资源的功能,请参阅创建基本 PS 提供程序。但是,大多数提供程序(包括此处描述的提供程序)可以使用 Windows PowerShell 提供的此功能的默认实现。

若要通过 Windows PowerShell 驱动器访问数据存储,您必须实现 System.Management.Automation.Provider.Drivecmdletprovider 基类的方法。有关实现这些方法的详细信息,请参阅创建 Windows PowerShell 驱动器提供程序。

要操作数据存储的项目(例如获取、设置和清除项目),提供程序必须实现 System.Management.Automation.Provider.Itemcmdletprovider 基类提供的方法。有关实现这些方法的详细信息,请参阅创建 Windows PowerShell 项提供程序。

要获取数据存储的子项或其名称,以及创建、复制、重命名和删除项的方法,您必须实现 System.Management.Automation.Provider.Containercmdletprovider 基类提供的方法。有关实现这些方法的详细信息,请参阅创建 Windows PowerShell 容器提供程序。

创建 Windows PowerShell 路径

Windows PowerShell 导航提供程序使用提供程序内部 Windows PowerShell 路径来导航数据存储的项目。要创建提供程序内部路径,提供程序必须实现 System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* 方法以支持来自 Joint-Path cmdlet 的调用。此方法使用父路径和子路径之间的提供程序特定的路径分隔符将父路径和子路径组合到提供程序内部路径中。

默认实现采用以“/”或“\”作为路径分隔符的路径,将路径分隔符规范化为“\”,使用它们之间的分隔符组合父路径部分和子路径部分,然后返回包含组合路径的字符串。

该导航提供程序未实现此方法。但是,以下代码是 System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* 方法的默认实现。

实施 MakePath 时需要记住的事项

以下条件可能适用于 System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* 的实现:

  • System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* 方法的实现不应将路径验证为提供程序命名空间中的合法完全限定路径。请注意,每个参数只能表示路径的一部分,并且组合的部分可能不会生成完全限定的路径。例如,文件系统提供程序的 System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* 方法可能会在 parent 参数中接收“windows\system32”,并在 子参数。该方法使用“\”分隔符连接这些值并返回“windows\system32\abc.dll”,这不是完全限定的文件系统路径。

    这很重要

    对 System.Management.Automation.Provider.Navigationcmdletprovider.Makepath* 的调用中提供的路径部分可能包含提供程序命名空间中不允许的字符。这些字符很可能用于通配符扩展,并且此方法的实现不应删除它们。

检索父路径

Windows PowerShell 导航提供程序实现 System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* 方法来检索指定的完整或部分提供程序特定路径的父部分。该方法删除路径的子部分并返回父路径部分。 root 参数指定驱动器根目录的完全限定路径。如果已安装的驱动器未用于检索操作,则此参数可以为 null 或为空。如果指定了根,则该方法必须返回与根位于同一树中的容器的路径。

示例导航提供程序不会重写此方法,而是使用默认实现。它接受同时使用“/”和“\”作为路径分隔符的路径。它首先将路径规范化为仅包含“\”分隔符,然后在最后一个“\”处分割父路径并返回父路径。

记住关于实现 GetParentPath

System.Management.Automation.Provider.Navigationcmdletprovider.Getparentpath* 方法的实现应在提供程序命名空间的路径分隔符上按词法分割路径。例如,文件系统提供程序使用此方法来查找最后一个“\”并返回分隔符左侧的所有内容。

检索子路径名称

您的导航提供程序实现 System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname* 方法来检索位于指定的完整或部分提供程序特定路径的项目子项的名称(叶元素)。

示例导航提供程序不会重写此方法。默认实现如下所示。它接受同时使用“/”和“\”作为路径分隔符的路径。它首先将路径规范化为仅包含“\”分隔符,然后在最后一个“\”处分割父路径并返回子路径部分的名称。

关于实现 GetChildName 需要记住的事情

System.Management.Automation.Provider.Navigationcmdletprovider.Getchildname* 方法的实现应在路径分隔符上按词法分割路径。如果提供的路径不包含路径分隔符,则该方法应返回未修改的路径。

这很重要

对此方法的调用中提供的路径可能包含在提供程序命名空间中非法的字符。这些字符很可能用于通配符扩展或正则表达式匹配,并且此方法的实现不应删除它们。

确定项目是否为容器

导航提供程序可以实现 System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* 方法来确定指定的路径是否指示容器。如果路径表示容器,则返回 true,否则返回 false。用户需要此方法才能使用 Test-Path cmdlet 作为所提供的路径。

以下代码显示了示例导航提供程序中的 System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer* 实现。该方法验证指定的路径是否正确以及表是否存在,如果路径指示容器,则返回 true。

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

关于实现 IsItemContainer 需要记住的事情

您的导航提供程序 .NET 类可能会从 System.Management.Automation.Provider.Providercapability 枚举中声明 ExpandWildcards、Filter、Inclusion 或 Exclude 提供程序功能。在这种情况下,System.Management.Automation.Provider.Navigationcmdletprovider.Isitemcontainer*的实现需要确保传递的路径满足要求。为此,该方法应访问适当的属性,例如 System.Management.Automation.Provider.Cmdletprovider.Exclude* 属性。

移动项目

为了支持 Move-Item cmdlet,您的导航提供程序实现了 System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* 方法。此方法将 path 参数指定的项目移动到 destination 参数中提供的路径处的容器。

示例导航提供程序不会重写 System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* 方法。以下是默认实现。

实施 MoveItem 时需要记住的事项

您的导航提供程序 .NET 类可能会从 System.Management.Automation.Provider.Providercapability 枚举中声明 ExpandWildcards、Filter、Inclusion 或 Exclude 提供程序功能。在这种情况下,System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* 的实现必须确保传递的路径满足要求。为此,该方法应访问适当的属性,例如 CmdletProvider.Exclude 属性。

默认情况下,除非 System.Management.Automation.Provider.Cmdletprovider.Force* 属性设置为 true,否则此方法的重写不应在现有对象上移动对象。例如,文件系统提供程序不会将 c:\temp\abc.txt 复制到现有的 c:\bar.txt 文件上,除非 System.Management.Automation.Provider.Cmdletprovider.Force* 属性设置为 true。如果 destination 参数中指定的路径存在并且是容器,则不需要 System.Management.Automation.Provider.Cmdletprovider.Force* 属性。在这种情况下,System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* 应将 path 参数指示的项目作为子项移动到 destination 参数指示的容器中。

System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* 方法的实现应调用 System.Management.Automation.Provider.Cmdletprovider.ShouldProcess 并在对数据存储进行任何更改之前检查其返回值。该方法用于在系统状态发生变化时确认操作的执行,例如删除文件。 System.Management.Automation.Provider.Cmdletprovider.ShouldProcess 将要更改的资源名称发送给用户,Windows PowerShell 运行时会考虑任何命令行设置或首选项变量来确定应向用户显示的内容。

在调用 System.Management.Automation.Provider.Cmdletprovider.ShouldProcess 返回 true 后,System.Management.Automation.Provider.Navigationcmdletprovider.Moveitem* 方法应调用 System.Management.Automation.Provider。 Cmdletprovider.ShouldContinue 方法。此方法向用户发送一条消息,以允许反馈是否应继续操作。您的提供程序应调用 System.Management.Automation.Provider.Cmdletprovider.ShouldContinue 作为对潜在危险的系统修改的额外检查。

将动态参数附加到 Move-Item Cmdlet

有时,Move-Item cmdlet 需要在运行时动态提供的其他参数。要提供这些动态参数,导航提供程序必须实现 System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters* 方法,以从指定路径的项目中获取所需的参数值,并返回一个具有解析属性和字段的对象类似于 cmdlet 类或 System.Management.Automation.Runtimedefineparameterdictionary 对象的属性。

该导航提供程序未实现此方法。但是,以下代码是 System.Management.Automation.Provider.Navigationcmdletprovider.Moveitemdynamicparameters* 的默认实现。

规范化相对路径

您的导航提供程序实现 System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* 方法,以将 path 参数中指示的完全限定路径标准化为相对于 basePath 指定的路径 参数。该方法返回规范化路径的字符串表示形式。如果 path 参数指定不存在的路径,则会写入错误。

示例导航提供程序不会重写此方法。以下是默认实现。

关于实现 NormalizeRelativePath 需要记住的事情

System.Management.Automation.Provider.Navigationcmdletprovider.Normalizerelativepath* 的实现应该解析 path 参数,但不必使用纯粹的语法解析。我们鼓励您设计此方法以使用路径在数据存储中查找路径信息并创建与大小写和标准化路径语法相匹配的路径。

代码示例

有关完整的示例代码,请参阅 AccessDbProviderSample05 代码示例。

定义对象类型和格式

提供者可以向现有对象添加成员或定义新对象。有关详细信息,请参阅扩展对象类型和格式。

构建 Windows PowerShell 提供程序

有关详细信息,请参阅如何注册 Cmdlet、提供程序和主机应用程序。

测试 Windows PowerShell 提供程序

当您的 Windows PowerShell 提供程序已向 Windows PowerShell 注册后,您可以通过在命令行上运行受支持的 cmdlet(包括通过派生提供的 cmdlet)来测试它。此示例将测试示例导航提供程序。

  1. 运行新 shell 并使用 Set-Location cmdlet 设置指示 Access 数据库的路径。

    Set-Location mydb:
    
  2. 现在运行 Get-Childitem cmdlet 来检索数据库项目列表,这些项目是可用的数据库表。对于每个表,此 cmdlet 还会检索表行数。

    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. 再次使用 Set-Location cmdlet 设置员工数据表的位置。

    Set-Location Employees
    
  4. 现在,我们使用 Get-Location cmdlet 来检索员工表的路径。

    Get-Location
    
    Path
    ----
    mydb:\Employees
    
  5. 现在使用通过管道传输到 Format-Table cmdlet 的 Get-Childitem cmdlet。这组 cmdlet 检索员工数据表的项目,即表行。它们的格式由 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. 您现在可以运行Get-Item cmdlet 来检索Employees 数据表第0 行的项目。

    Get-Item 0
    
    PSPath        : AccessDB::C:\PS\Northwind.mdb\EmployeesGet-Item
    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. 再次使用 (Get-Item 0).data cmdlet 检索第 0 行中项目的员工数据。

    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
    

    参见

创建 Windows PowerShell 提供程序

设计您的 Windows PowerShell 提供程序

扩展对象类型和格式

实施容器 Windows PowerShell 提供程序

如何注册 Cmdlet、提供程序和主机应用程序

Windows PowerShell 程序员指南

Windows PowerShell SDK

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯