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

PowerShell:如何让ArgumentCompleter补全带空格参数时仅命令行加单引号

实现与原生Cmdlet一致的ArgumentCompleter补全行为

你的函数当前问题在于手动为带空格的虚拟机名添加单引号,导致补全列表和命令行都显示引号,不符合原生Cmdlet的自动处理逻辑。原生行为是补全列表显示无引号的名称,选中后PowerShell自动为带空格的参数添加引号。

专业实现方式

不需要手动添加引号,ArgumentCompleter只需返回纯字符串形式的虚拟机名称,PowerShell会自动处理引号包裹逻辑。若需更精细控制补全项的显示与实际值,可使用[System.Management.Automation.CompletionResult]类构建补全结果,这是PowerShell官方推荐的专业做法。

修改后的完整函数代码

#Requires -Modules Hyper-V
#Requires -RunAsAdministrator
function Get-VMNameTest
{
    param (
        [ArgumentCompleter({
            param ($Command, $Parameter, $WordToComplete, $CommandAst, $FakeBoundParams)
            # 筛选匹配的虚拟机名称,返回纯字符串或用CompletionResult包装
            (Get-VM).Name | Where-Object { $_ -like "*$WordToComplete*" } | ForEach-Object {
                [System.Management.Automation.CompletionResult]::new(
                    $_,          # 实际插入命令行的参数值
                    $_,          # 补全列表中显示的文本
                    'ParameterValue', # 补全项类型
                    $_           # 可选:鼠标悬停时显示的工具提示
                )
            }
        })]
        [string[]]$Name
    )

    foreach ($vm in $Name)
    {
        Write-Output "VMName:  $vm"
    }
}

简化版本(适用于简单场景)

如果不需要额外的工具提示或复杂控制,直接返回纯名称字符串即可实现相同效果:

[ArgumentCompleter({
    param ($Command, $Parameter, $WordToComplete, $CommandAst, $FakeBoundParams)
    (Get-VM).Name | Where-Object { $_ -like "*$WordToComplete*" }
})]

关键说明

  • PowerShell内置了参数补全的引号处理逻辑,当补全值包含空格、特殊字符时,会自动为其添加单/双引号,无需手动干预。
  • 使用CompletionResult可以更灵活地定义补全项的显示文本、实际插入值和类型,适合复杂的补全场景(比如显示别名但实际插入真实值)。

内容的提问来源于stack exchange,提问作者Paul π

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:17:27