0

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

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

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

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

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

4

2 回答 2

1

确保覆盖IsValidPathandItemExists方法:

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

protected override bool ItemExists(string path)
{
  return true;
}
于 2014-02-24T02:09:27.543 回答
1

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

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

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

于 2014-02-25T09:30:54.930 回答