[玩转系统] 创建 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)来测试它。此示例将测试示例导航提供程序。
运行新 shell 并使用
Set-Location
cmdlet 设置指示 Access 数据库的路径。Set-Location mydb:
现在运行
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
再次使用
Set-Location
cmdlet 设置员工数据表的位置。Set-Location Employees
现在,我们使用
Get-Location
cmdlet 来检索员工表的路径。Get-Location
Path ---- mydb:\Employees
现在使用通过管道传输到
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
您现在可以运行
Get-Item
cmdlet 来检索Employees 数据表第0 行的项目。Get-Item 0
PSPath : AccessDB::C:\PS\Northwind.mdb\Employees
Get-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再次使用
(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
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag