我正在尝试将我的自定义项目文件模拟为新的PS Drive。我正在尝试创建源自Powershell Provider的自定义NavigationCmdletProvider。我已经覆盖了PSDriveInfo来读取并包含文件中的项目,filepath位于PSDriveInfo的根目录中。
我无法正确覆盖GetItem。我想要做的是使用GetNamesFromPath(path, out tableName, out rowNumber)
方法。由于我的自定义项目基本上是数据集,因此我想使用tableName来获取DataTable和DataNow的ID的rowNumber。
问题是我得到了“路径不存在”的那种错误。它没有事件进入重写方法。我错过了要覆盖的东西吗?文件路径确实不存在,但我只需要处理路径并将WriteItemObject与我想要的对象一起返回,而不检查是否为有效路径。
编辑1:
我注意到的一件事是它永远不会进入GetItem
,因此进入IsValidPath
。当我调试并使用断点时,首先我加载驱动器,然后Set-Location
加载到驱动器,IsItemContainer
被调用(必须覆盖它才能使Set-Location
工作)。
GetItem
和IsValidPath
,就好像它在调用重写方法之前检查有效路径一样。 NavigationCmdletProvider
可以使用不存在的路径(文件本身除外),只需处理将作为路径手动处理的字符串吗?
答案 0 :(得分:1)
请务必覆盖IsValidPath
和ItemExists
方法:
protected override bool IsValidPath(string path)
{
return true;
}
protected override bool ItemExists(string path)
{
return true;
}
答案 1 :(得分:1)
如果您要延长NavigationCmdletProvider
,那么您应该覆盖IsValidPath,ItemExists,GetItem,GetChildItems以及可能的其他方法,具体取决于您想要的功能支持您的PS驱动器。
找出缺少实现的方法的最佳方法是覆盖所有虚方法并在每个方法中放置一个断点。然后执行cmdlet并在调试器中查看调用的内容以及参数值。
不幸的是,没有很多关于实现自定义PowerShell提供程序的详细文档。但是,您可以在MSDN上找到关于此主题的非常详细的教程,其中包含大量源代码示例。另外,您可以查看PowerShell VFS项目 - 它是PowerShell提供程序API的包装器,可以更轻松地构建复杂的提供程序。