You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义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));
    }
}

说明

  1. GetNewItemTypeDynamicParameters是Provider基类提供的扩展点,专门用于为-ItemType参数添加动态特性,不会和原有参数产生冲突。
  2. 动态参数类的属性名使用Type,因为PowerShell中-ItemType参数的别名是-Type,这样能自动关联补全逻辑到目标参数。
  3. 补全逻辑中加入前缀过滤,提升用户输入体验。

内容的提问来源于stack exchange,提问作者Philipp Naused

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:35:40