我正在为一些内部分层数据实现Powershell PSProvider。一切正常,我可以使用通常的cd / dir命令在树中导航,唯一不起作用的是Tab完成。
我可以看到Powershell在按Tab键时调用函数GetChildName()并在路径中带星号(如果我输入“dir c”并按Tab键,将使用字符串“c *”调用GetChildName()函数,好几次)。我试图从以“c”开头的文件夹中返回所有子名称,但Powershell始终只显示前面的第一个子名称。我找不到有关此行为的任何文档,我缺少什么?
答案 0 :(得分:0)
你确定你不仅仅看到了正常行为吗?使用默认的Tab Expansion,您只能看到第一个结果。再按一次选项卡将循环显示提供商返回的结果列表。
提供商存在一些怪癖。我一直在使用Script Provider项目。我将调试代码放在我的所有方法中,以查看PowerShell正在调用哪些,何时以及使用什么参数。
答案 1 :(得分:0)
我发现问题出在哪里 - 如果星号是名称的一部分,提供者中的函数GetChildName()不应该尝试扩展给定的文件名;如果函数可以找到完全匹配,则该函数应该返回子名称,或者在任何其他情况下调用base.GetChildName()。像这样:
protected override string GetChildName(string path) {
string name = SomeFunctionThatTriesToFindExactMatchForGivenPath(path);
if(string.IsNullOrEmpty( ret ) )
ret = base.GetChildName( path );
return ret;
}
顺便说一句,我发现默认选项卡扩展对于可以从GetChildName()函数返回的内容非常宽容 - 即使返回值在前面/后面有斜杠/反斜杠,选项卡扩展也可以。但是,流行的标签扩展模块PowerTab对返回值更加挑剔。