2014-02-24 32 views
0

我试图模仿我的自定义项目文件作为新的PS驱动器。我正在尝试创建自NavigationCmdletProvider派生的自定义Powershell Provider。我已经重写了PSDriveInfo来读取并包含来自文件的项目,并且文件路径位于PSDriveInfo的根目录中。Powershell提供程序 - GetItem路径错误 - 自定义文件作为驱动器

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

问题是我得到“路径不存在”类错误。它不会进入重写的方法。我错过了什么可以重写吗?文件路径并不存在,但我只需要处理路径并使用WriteItemObject和我想要的对象返回,而不检查它是否是有效的路径。

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

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

回答

1

确保您覆盖IsValidPathItemExists方法:

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

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

我怀疑这件事很简单,我错过了。但它并没有解决问题。我重写了'IsValidPath'方法总是返回true并且改变'GetItem'总是返回同一个表,只是为了看看它是否工作。仍然是同样的错误“Get-Item:无法找到路径'MyDrive:\ myName',因为它不存在。” 我注意到的一件事是它永远不会进入'GetItem',因此进入'IsValidPath'。当我调试和使用断点时,首先加载驱动器,然后将'Set-Location'加载到驱动器,调用IsItemContainer'。不调用“GetItem”和/或“IsValidPath”。 –

+0

我经历了一段时间以前写过的提供程序,试着重写'ItemExists'。 –

+0

是的,它没有被正确覆盖,只在某些情况下工作。我应该看到,但我受够了。 Thx –

1

如果要扩展NavigationCmdletProvider那么你应该重写取决于你想为支持哪些功能IsValidPathItemExistsGetItemGetChildItems和其他可能的方法你的PS硬盘。

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

不幸的是,关于实现自定义PowerShell提供程序的详细文档并不多。但是,您可以在MSDN上找到关于此主题的非常详细的教程,其中包含许多源代码示例。此外,您可以看看PowerShell VFS项目 - 它是PowerShell提供程序API的包装,使构建复杂提供程序变得更容易。

+0

好吧,不要像你所说的一步一步地走,我想我需要听取别人的意见才能真正做到这一点。终于,我现在正在取得一些进展。谢谢。 –

相关问题