установить местоположение для пользовательского ContainerCmdletProvider элемента

Я пытаюсь создать собственный поставщик PowerShell в С#, который позволяет вам управлять элементами (в каталоге типа папки), пользователи должны иметь возможность переходить в -> файлы/папку и иметь возможность видеть дочерние элементы и т. д. и манипулировать этим. Моя проблема в том, что я всегда могу перейти в корневой каталог, однако, как только я попытаюсь установить свое местоположение в myAcme:/any_path_here_of_valid_item, произойдет ошибка, как показано ниже. Это странно, так как я могу получить предмет на этом пути. Я что-то здесь не понимаю или невозможно установить ваше местоположение на местоположение элемента (я пытаюсь установить свое местоположение на этот элемент, чтобы получить его дочерние элементы)

PS my****:\> cd myAcme:/
PS myAcme:\> get-item /files/folders/****
<Removed so you don' get hit by a wall of text but this displays the items info fine>
PS myAcme:\> cd myAcme:/files/folders/****
Set-Location : Cannot find path 'myAcme:/files/folders/****' because it does not exist.
At line:1 char:3
+ cd <<<<  myAcme:/files/folders/****
    + CategoryInfo          : ObjectNotFound: (myAcme:/files/folders/****:String) [Set-Location], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

Я пока не буду приводить здесь какой-либо код, так как более вероятно, что мне не хватает понимания концепции containercmdletprovider.

РЕДАКТИРОВАТЬ Я забыл добавить в отладчик, что ItemExists возвращает true, когда я выполняю команду cd myAcme:/files/folders/**


person user1573830    schedule 03.08.2012    source источник
comment
извините за то, что x0n забыл нажать на большую галочку ›.‹   -  person user1573830    schedule 07.08.2012


Ответы (1)


ContainerCmdletProvider предназначен только для простых поставщиков, у которых нет подпапок. Примерами таких поставщиков являются диски function, env и variable в PowerShell. Такие провайдеры не поддерживают set-location, get-location (cd) или понятие вложенных путей. Все должно быть в корне и должно быть конечным узлом (например, файлом).

Если вы хотите использовать древовидную структуру, вы должны наследоваться от NavigationCmdletProvider. Возможно, вам будет проще разрабатывать, если вы воспользуетесь моей структурой поставщиков сценариев, которая позволяет очень быстро создавать прототипы поставщиков с помощью обычного сценария PowerShell. Есть несколько примеров и простых документов, а также файлы для загрузки на http://psprovider.codeplex.com/

Удачи!

person x0n    schedule 03.08.2012