Как поддержать расширение вкладки powershell в psprovider?
Я внедряю Powershell PSProvider для некоторых внутренних иерархических данных. Все работает нормально, я могу перемещаться по дереву с помощью обычных команд cd/dir, единственное, что не работает, - это завершение табуляции.
Я вижу, что Powershell вызывает функцию GetChildName() со звездочкой в пути при нажатии Tab (если я наберу "dir c" и нажму Tab, функция GetChildName() будет вызываться со строкой "c*" несколько раз). Я попытался вернуть все дочерние имена из папки, которая начинается с "c", но Powershell всегда отображает только первое дочернее имя спереди. Я не могу найти никаких документов об этом поведении, что мне не хватает?
2 ответа
Я обнаружил, в чем проблема - функция 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, популярный модуль расширения вкладок, гораздо более требователен к возвращаемым значениям.
Вы уверены, что не просто видите нормальное поведение? С расширением вкладки по умолчанию вы увидите только первый результат. При нажатии на вкладку дополнительное время будет пролистываться список возвращенных результатов от провайдера.
Есть некоторые причуды с провайдерами. Я работал над одним с использованием проекта Script Provider. Я добавил отладочный код во все мои методы, чтобы увидеть, какие из них вызывал PowerShell, когда и с какими аргументами.