这个主题是学习如何创建 Windows PowerShell 提供者的起点。 这里描述的基本提供者提供了启动和停止提供者的方法,虽然该提供者不提供访问数据存储或获取或设置数据存储的方式,但它提供了所有提供者所需的基本功能。
如前所述,这里描述的基本提供者实现了启动和停止服务的方法。 Windows PowerShell 运行时调用这些方法来初始化和取消初始化提供者。
注释
你可以在 Windows PowerShell 提供的AccessDBSampleProvider01.cs文件中找到该提供者的示例。
定义 Windows PowerShell 提供者类
创建 Windows PowerShell 提供者的第一步是定义其 .NET 类。 该基本提供者定义了一个类,该 AccessDBProvider 类源自 System.Management.Automation.Provider.CmdletProvider 基类。
建议将提供者类置于 Providers API命名空间的命名空间中,例如xxx.PowerShell.Providers。 该提供者使用 Microsoft.Samples.PowerShell.Provider 命名空间,所有 Windows PowerShell 提供者样本都运行于该命名空间。
注释
Windows PowerShell 提供者的类必须明确标记为公用。 未标记为公共的类将默认为内部类,Windows的PowerShell运行时不会找到。
以下是该基本提供者的类定义:
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : CmdletProvider
在类定义之前,必须声明 System.Management.Automation.Provider.CmdletProviderAttribute 属性,语法为[CmdletProvider()]。
如果需要,你可以设置属性关键词来进一步声明该类。 注意这里声明的 System.Management.Automation.Provider.CmdletProviderAttribute 属性包含两个参数。 第一个属性参数指定了提供者的默认友好名称,用户可以之后修改。 第二个参数指定了 Windows PowerShell 定义的能力,供述者在命令处理过程中向 Windows PowerShell 运行时开放。 提供者能力的可能值由 System.Management.Automation.Provider.ProviderCapabilities 枚举定义。 因为这是一个基础供应商,所以不支持任何功能。
注释
Windows PowerShell 提供者的完整限定名称包含 Windows PowerShell 在提供者注册时确定的汇编名称及其他属性。
定义州 Provider-Specific 信息
System.Management.Automation.Provider.CmdletProvider 基类及所有派生类被视为无状态,因为 Windows PowerShell 运行时仅在需要时创建提供者实例。 因此,如果您的提供商需要对提供者特定数据进行完全控制和状态维护,则必须从 System.Management.Automation.ProviderInfo 类中派生类。 您的派生类应定义维护状态所需的成员,以便在 Windows PowerShell 运行时调用 System.Management.Automation.Provider.CmdletProvider.Start* 方法初始化提供者时,能够访问提供者专用数据。
Windows PowerShell 提供者也可以维护基于连接的状态。 有关维护连接状态的更多信息,请参见 创建PowerShell驱动器提供者。
初始化提供者
为了初始化提供者,Windows PowerShell 运行时调用 System.Management.Automation.Provider.CmdletProvider.Start* 方法。 大多数情况下,你的提供者可以使用该方法的默认实现,该实现会返回描述你的提供者的 System.Management.Automation.ProviderInfo 对象。 然而,如果你想添加额外的初始化信息,你应该实现自己的 System.Management.Automation.Provider.CmdletProvider.Start* 方法,返回一个经过修改的 System.Management.Automation.ProviderInfo 对象,并传递给你的提供者。 一般来说,该方法应返回传递给它的 System.Management.Automation.ProviderInfo 对象,或包含其他初始化信息的修改 System.Management.Automation.ProviderInfo 对象。
该基本服务提供者不会覆盖该方法。 然而,以下代码显示了该方法的默认实现:
提供者可以按照 定义提供者特定数据状态中描述的状态来维护提供者特定信息的状态。 在这种情况下,你的实现必须覆盖 System.Management.Automation.Provider.CmdletProvider.Start* 方法,以返回派生类的实例。
启动动态参数
你对 System.Management.Automation.Provider.CmdletProvider.Start* 方法的提供者实现可能需要额外参数。 此时,提供者应覆盖 System.Management.Automation.Provider.CmdletProvider.StartDynamicParameters* 方法,返回一个具有属性和场的对象,解析属性类似于cmdlet类或 System.Management.Automation.RuntimeDefinedParameterDictionary 对象。
该基本服务提供者不会覆盖该方法。 然而,以下代码显示了该方法的默认实现:
取消初始化提供者
为了释放 Windows PowerShell 提供者使用的资源,你的服务提供者应实现自己的 System.Management.Automation.Provider.CmdletProvider.Stop* 方法。 该方法由 Windows PowerShell 运行时调用,在会话结束时取消初始化提供者。
该基本服务提供者不会覆盖该方法。 然而,以下代码显示了该方法的默认实现:
代码示例
完整示例代码请参见 AccessDbProviderSample01 代码示例。
测试Windows PowerShell提供者
一旦你的 Windows PowerShell 提供者注册好 Windows PowerShell,你可以通过命令行运行支持的 cmdlet 来测试。 对于这个基础提供者,运行新的shell并使用 Get-PSProvider cmdlet检索提供者列表,确保AccessDb提供者存在。
Get-PSProvider
随即显示以下输出:
Name Capabilities Drives
---- ------------ ------
AccessDb None {}
Alias ShouldProcess {Alias}
Environment ShouldProcess {Env}
FileSystem Filter, ShouldProcess {C, Z}
Function ShouldProcess {function}
Registry ShouldProcess {HKLM, HKCU}