2014-09-02 5 views
4

Я хочу создать поставщика PowerShell, который будет работать как структура каталогов. Корень - это веб-адрес, который возвращает текстовый файл. Этот файл имеет список элементов. Когда каждый из этих элементов добавляется к концу исходного веб-адреса, я получаю другой файл с другим списком элементов. Это происходит рекурсивно, пока файл не возвращает какой-либо элемент. Таким образом, структура, как:Внештатная реализация поставщика Powershell

root: 1.2.3.4/test/  -> returns file0 
file0: item1, item2, item3 

1.2.3.4/test/item1  -> returns file1 
1.2.3.4/test/item2  -> returns file2 
1.2.3.4/test/item3  -> returns file3 

file1: item4, item5 
file2: item6 
file3: <empty> 

Поскольку я хочу создать навигацию, как структура, я расширил NavigationCmdletProvider

public class TESTProvider : NavigationCmdletProvider 

Я могу создать новый PSDrive следующим образом:

PS c:\> New-PSDrive -Name dr1 -PSProvider TestProvider -Root http://1.2.3.4/v1 

Name   Used (GB)  Free (GB) Provider  Root           CurrentLocation 
----   ---------  --------- --------  ------------------- 
dr1         TestProvider http://1.2.3.4/v1 

Но когда я «cd» к этому приводу, я получаю ошибку:

PS c:\> cd dr1: 

cd : Cannot find path 'dr1:\' because it does not exist. 
At line:1 char:1 
+ cd dr1: 
+ ~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (dr1:\:String) [Set-Location], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand 

Какой метод я должен реализовать/переопределить, чтобы показать приглашение как PS dr1:> когда я делаю cd dr1 :? (После этого я понял, что мне придется переопределить GetChildItems(string path, bool recurse), чтобы получить item1, item2, item3 в списке.)

+1

Это не совсем ответ на ваш вопрос, но вы должны смотреть на https://github.com/beefarino/p2f/ или https://github.com/beefarino/simplex - они делают создание провайдера намного проще. –

ответ

3

Я обнаружил, что реализация IsValidPath, ItemExists, IsItemContainer и GetChildren получить вас в рабочее состояние. Это то, что я обычно начинаю с тем, когда я реализую навигации провайдера:

[CmdletProvider("MyPowerShellProvider", ProviderCapabilities.None)] 
public class MyPowerShellProvider : NavigationCmdletProvider 
{ 

    protected override bool IsValidPath(string path) 
    { 
     return true; 
    } 

    protected override Collection<PSDriveInfo> InitializeDefaultDrives() 
    { 
     PSDriveInfo drive = new PSDriveInfo("MyDrive", this.ProviderInfo, "", "", null); 
     Collection<PSDriveInfo> drives = new Collection<PSDriveInfo>() {drive}; 
     return drives; 
    } 

    protected override bool ItemExists(string path) 
    { 
     return true; 
    } 

    protected override bool IsItemContainer(string path) 
    { 
     return true; 
    } 

    protected override void GetChildItems(string path, bool recurse) 
    { 
     WriteItemObject("Hello", "Hello", true); 
    } 
} 
Смежные вопросы