如何为自定义PowerShell Provider的New-Item cmdlet添加ItemType参数补全?
自定义PowerShell Provider中为New-Item的-ItemType添加参数补全
我正在用PowerShellStandard.Library开发自定义PowerShell Provider,需要为New-Item cmdlet的-ItemType参数添加参数补全支持(类似FileSystem Provider中Tab补全File、Directory等值的效果),但未找到官方文档说明内置Provider的实现方式。
由于-ItemType参数并非自定义代码中定义,无法直接在C#的itemTypeName参数上使用[ArgumentCompleter]特性。曾尝试通过重写NewItemDynamicParameters方法覆盖参数,代码如下:
protected override object NewItemDynamicParameters(string path, string itemTypeName, object newItemValue) { return new NewItemDynamicParameters(); } internal sealed class NewItemDynamicParameters { [Parameter, ArgumentCompleter(typeof(ItemTypeCompleter))] public string ItemType { get; set; } } internal class ItemTypeCompleter : IArgumentCompleter { public IEnumerable<CompletionResult> CompleteArgument(string commandName, string parameterName, string wordToComplete, CommandAst commandAst, IDictionary fakeBoundParameters) { return new[] { "Value1", "Value2" }.Select(s => new CompletionResult(s)); } }
执行后出现参数重复定义错误,且未触发补全:
A parameter with the name 'ItemType' was defined multiple times for the command. At line:1 char:1 + New-Item 1 -ItemType test + ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], MetadataException + FullyQualifiedErrorId : ParameterNameAlreadyExistsForCommand
解决方案
不能通过动态参数重新定义ItemType(该参数由Provider基类自带),正确做法是重写**GetNewItemTypeDynamicParameters方法**,该方法专门用于为ItemType参数绑定动态特性,包括参数补全逻辑。
示例代码如下:
using System.Collections; using System.Collections.Generic; using System.Linq; using System.Management.Automation; using System.Management.Automation.Language; // 自定义Provider类中重写方法 protected override object GetNewItemTypeDynamicParameters(string itemTypeName) { return new ItemTypeDynamicParameters(); } internal sealed class ItemTypeDynamicParameters { // 使用Type作为属性名,对应-ItemType的别名-Type [ArgumentCompleter(typeof(ItemTypeCompleter))] public string Type { get; set; } } internal class ItemTypeCompleter : IArgumentCompleter { public IEnumerable<CompletionResult> CompleteArgument(string commandName, string parameterName, string wordToComplete, CommandAst commandAst, IDictionary fakeBoundParameters) { // 自定义支持的ItemType选项,可根据实际需求调整 var validItemTypes = new[] { "Value1", "Value2", "Value3" }; // 按输入前缀过滤,忽略大小写 return validItemTypes .Where(type => type.StartsWith(wordToComplete, System.StringComparison.OrdinalIgnoreCase)) .Select(type => new CompletionResult(type)); } }
说明
GetNewItemTypeDynamicParameters是Provider基类提供的扩展点,专门用于为-ItemType参数添加动态特性,不会和原有参数产生冲突。- 动态参数类的属性名使用
Type,因为PowerShell中-ItemType参数的别名是-Type,这样能自动关联补全逻辑到目标参数。 - 补全逻辑中加入前缀过滤,提升用户输入体验。
内容的提问来源于stack exchange,提问作者Philipp Naused
相关产品推荐
相关产品推荐

