0

我正在为 PowerShell 编写NavigationCmdletProvider。通过GetItemGetChildItems覆盖,可以将各种类型的对象写入管道。

IPropertyCmdletProvider接口的文档告诉我们以下内容:

开发者应在以下条件下实现该接口:

  • 当用户必须使用诸如 Get-Property 和 Set-Property cmdlet 之类的 cmdlet 时。
  • 对于从 ItemCmdletProvider、ContainerCmdletProvider 或 NavigationCmdletProvider 类派生的提供程序。

困惑:

我认为没有很多有用的信息,因为用户如何知道他们是否必须使用 Get-Property 和 Set-Property cmdlet?我想这取决于 Cmdlet 作者。最大的困惑(至少对我而言)是 Cmdlet 是否将对象写入管道;并且这些对象具有可调用的公开属性(即获取/设置);调用 Get-Property/Set-Property 比直接操作对象有什么好处?

问题:

什么情况下应该实现IPropertyCmdletProvider接口?

我知道我在这里遗漏了一些东西!任何见解将不胜感激。

4

1 回答 1

3

哇,那些文档有点老了。没有 Get/Set-Property cmdlet。这必须是指 Get/Set-ItemProperty cmdlet。对于 RegistryProvider,这些 cmdlet 是必不可少的,因为它是访问注册表值的唯一方法。也就是说,Get-Item/ChildItem cmdlet 仅返回 RegistryKey 对象,而从不返回注册表值对象(它们在 .NET 中不存在)。您必须使用 Get/Set-ItemProperty 在 regkey 下获取/设置特定的 regval。

OTOH FileSystem 提供程序允许您直接访问容器(目录)和叶子(文件)。您可以直接获取文件的内容。不过,如果要获取文件的 LastWriteTime,可以使用 Get-ItemProperty:

PS> Get-ItemProperty -Path .\DotNetTypes.format.ps1xml -Name LastWriteTime


PSPath        : Microsoft.PowerShell.Core\FileSystem::C:\Win
                dows\System32\WindowsPowerShell\v1.0\DotNetT
                ypes.format.ps1xml
PSParentPath  : Microsoft.PowerShell.Core\FileSystem::C:\Win
                dows\System32\WindowsPowerShell\v1.0
PSChildName   : DotNetTypes.format.ps1xml
PSDrive       : C
PSProvider    : Microsoft.PowerShell.Core\FileSystem
LastWriteTime : 4/24/2009 11:21:46 AM

但是,我通常不会以这种方式访问​​此属性。我发现输出是冗长的。我会这样做:

PS> (Get-Item .\DotNetTypes.format.ps1xml).LastWriteTime

Friday, April 24, 2009 11:21:46 AM

至于指导,我想说如果您采用 RegistryProvider 方法,您确实需要实现此接口,但如果您走 FileSystem 提供程序所走的路线,那么它就不那么重要了,因为您可以轻松地直接访问 Get 返回的对象的属性-项目/子项目。

于 2009-10-08T19:32:51.243 回答