自定义Powershell提供程序实现

本文关键字:程序 实现 Powershell 自定义 | 更新日期: 2023-09-27 18:20:34

我想创建一个类似目录结构的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

当我执行cd dr1:时,我必须使用什么方法来实现/覆盖以将提示显示为PS dr1:>?(在这之后,我明白我必须重写GetChildItems(string path, bool recurse)才能列出项目1、项目2和项目3。)

自定义Powershell提供程序实现

我发现实现IsValidPathItemExistsIsItemContainerGetChildren可以使您进入工作状态。这是我在实现导航提供商时通常要从的内容:

[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);
    }
}