自定义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。)
我发现实现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);
}
}