Поставщик Powershell - Ошибка пути GetItem - Пользовательский файл как диск
Я пытаюсь эмулировать свой файл проекта как новый PS Drive. Я пытаюсь создать свой собственный поставщик Powershell, производный от NavigationCmdletProvider. Я переопределил PSDriveInfo для чтения и хранения проекта из файла, а путь к файлу находится в корне PSDriveInfo.
Я не могу переопределить GetItem правильно. Что я хочу сделать, это использовать GetNamesFromPath(path, out tableName, out rowNumber)
метод. Поскольку мой пользовательский проект в основном представляет собой набор данных, я хотел бы использовать tableName, чтобы получить DataTable и rowNumber для идентификатора DataRow.
Проблема в том, что я получаю ошибку типа "путь не существует". Событие не попадает в переопределенный метод. Я что-то упускаю, чтобы переопределить? Путь к файлу на самом деле не существует, но мне просто нужно обработать путь и использовать WriteItemObject с тем, что я хочу в качестве возвращаемых объектов, без проверки, является ли это допустимым путем.
Редактировать 1: Одна вещь, которую я заметил, что она никогда не попадает в GetItem
и, следовательно, в IsValidPath
, Когда я отлаживаю и использую точки останова, сначала я загружаю диск, а затем Set-Location
к драйву, IsItemContainer
называется (это должно быть переопределено для Set-Location
работать).
GetItem
а также IsValidPath
не вызываются вообще, как будто он проверяет допустимый путь перед вызовом переопределенного метода. Можно NavigationCmdletProvider
работать с несуществующими путями (кроме самого файла), просто работать со строками, которые будут обрабатываться вручную так же, как пути?
2 ответа
Убедитесь, что вы переопределите IsValidPath
а также ItemExists
методы:
protected override bool IsValidPath(string path)
{
return true;
}
protected override bool ItemExists(string path)
{
return true;
}
Если вы расширяете NavigationCmdletProvider
затем вы должны переопределить IsValidPath, ItemExists, GetItem, GetChildItems и, возможно, другие методы в зависимости от того, какие функции вы хотите поддерживать для своих дисков PS.
Лучший способ выяснить, в каких методах отсутствует реализация, - переопределить все виртуальные методы и установить точку останова в каждом из них. Затем выполните командлет и посмотрите в отладчике, что вызывается и каковы значения параметров.
К сожалению, не так много подробной документации о реализации пользовательских провайдеров PowerShell. Тем не менее, вы можете найти довольно подробное руководство по этой теме на MSDN с множеством примеров исходного кода. Кроме того, вы можете взглянуть на проект PowerShell VFS - это оболочка вокруг API поставщика PowerShell, упрощающая создание сложных поставщиков.