【问题标题】:Powershell Provider - GetItem Path Error - Custom File as DrivePowershell Provider - GetItem 路径错误 - 自定义文件作为驱动器
【发布时间】:2014-02-24 02:01:36
【问题描述】:

我正在尝试将我的自定义项目文件模拟为新的 PS Drive。我正在尝试创建源自NavigationCmdletProvider 的自定义Powershell Provider。我已经覆盖 PSDriveInfo 以从文件中读取和包含项目,并且文件路径位于 PSDriveInfo 的根目录中。

我无法正确覆盖 GetItem。我想做的是使用GetNamesFromPath(path, out tableName, out rowNumber) 方法。由于我的自定义项目基本上是数据集,我想使用 tableName 来获取 DataRow 的 ID 的 DataTable 和 rowNumber。

问题是我得到“路径不存在”的错误。它不会进入被覆盖的方法。我是否缺少要覆盖的东西?文件路径实际上并不存在,但我只需要处理路径并将 WriteItemObject 与我想要的对象一起使用,而不检查它是否有效路径。

编辑 1: 我注意到的一件事是它永远不会进入GetItem,因此不会进入IsValidPath。当我调试和使用断点时,首先我加载驱动器,然后将Set-Location 加载到驱动器中,调用IsItemContainer(它必须被覆盖,Set-Location 才能工作)。

GetItemIsValidPath 根本不被调用,就好像它在调用被覆盖的方法之前检查有效路径一样。 NavigationCmdletProvider 可以使用不存在的路径(文件本身除外),只使用将像路径一样手动处理的字符串吗?

【问题讨论】:

    标签: c# powershell powershell-provider


    【解决方案1】:

    确保覆盖 IsValidPathItemExists 方法:

    protected override bool IsValidPath(string path)
    {
        return true;
    }
    
    protected override bool ItemExists(string path)
    {
      return true;
    }
    

    【讨论】:

    • 我怀疑这是我错过的一些简单的事情。但这并没有解决问题。我重写了IsValidPath 方法以始终返回true,并将GetItem 更改为始终返回同一个表,只是为了看看它是否有效。仍然是相同的错误“Get-Item:找不到路径'MyDrive:\ myName',因为它不存在。”。我注意到的一件事是它永远不会进入GetItem,因此不会进入IsValidPath。当我调试和使用断点时,首先我加载驱动器,然后将Set-Location 加载到驱动器中,调用IsItemContainerGetItem 和/或 IsValidPath 未被调用。
    • 我浏览了我不久前写的一个提供程序,也尝试覆盖ItemExists
    • 是的,它没有被正确覆盖,仅在某些情况下有效。我应该看到的,但我受够了。谢谢
    【解决方案2】:

    如果您要扩展 NavigationCmdletProvider,那么您应该覆盖 IsValidPathItemExistsGetItemGetChildItems 以及可能的其他方法,具体取决于您希望为您的 PS 驱动器支持哪些功能。

    找出哪些方法缺少实现的最佳方法是覆盖所有虚拟方法并在每个方法中放置一个断点。然后执行一个 cmdlet 并在调试器中查看调用了什么以及参数值是什么。

    不幸的是,没有很多关于实现自定义 PowerShell 提供程序的详细文档。但是,您可以在 MSDN 上找到关于此主题的非常详细的教程,其中包含大量源代码示例。此外,您可以查看 PowerShell VFS 项目 - 它是 PowerShell 提供程序 API 的包装器,可以更轻松地构建复杂的提供程序。

    【讨论】:

    • 好吧,与其按照您的建议逐步进行,我想我需要听取其他人的意见才能真正做到这一点。我现在终于取得了一些进展。谢谢。
    猜你喜欢
    • 2017-09-18
    • 2018-02-11
    • 1970-01-01
    • 2018-03-06
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多