Как поддержать расширение вкладки 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, когда и с какими аргументами.

Другие вопросы по тегам