PowerShell自定义可执行文件的分层参数自动补全需求
PowerShell 实现 example.exe 分层参数自动补全方案
原脚本仅返回固定的顶层参数,无法根据输入上下文提供分层补全,还会重复提示已输入的选项。以下是解决这个问题的完整实现:
完整脚本
$scriptBlock = { param($wordToComplete, $commandAst, $cursorPosition) # 提取已输入的参数(排除命令本身) $inputArgs = $commandAst.CommandElements | Select-Object -Skip 1 | ForEach-Object { $_.Value } # 根据已输入参数的数量判断补全层级 switch ($inputArgs.Count) { # 未输入任何参数时,返回顶层选项 0 { 'foo', 'bar' | Where-Object { $_ -like "$wordToComplete*" } } # 已输入一个参数时,返回对应子选项 1 { switch ($inputArgs[0]) { 'foo' { 'foo_sub1', 'foo_sub2' | Where-Object { $_ -like "$wordToComplete*" } } 'bar' { 'bar_sub1', 'bar_sub2' | Where-Object { $_ -like "$wordToComplete*" } } } } # 如需支持更多层级,可继续添加case } } Register-ArgumentCompleter -CommandName .\example.exe -ScriptBlock $scriptBlock
关键逻辑说明
- 解析输入上下文:通过
$commandAst.CommandElements获取已输入的所有命令元素,跳过第一个(即.\example.exe)得到已输入的参数列表$inputArgs。 - 分层补全判断:
- 当未输入任何参数时,返回顶层的
foo、bar选项,同时通过Where-Object过滤出与当前输入内容匹配的选项。 - 当已输入一个参数时,根据第一个参数的值返回对应的子选项,同样做匹配过滤,确保只显示相关的子参数,自然避免了重复提示顶层选项的问题。
- 当未输入任何参数时,返回顶层的
- 匹配当前输入:
Where-Object { $_ -like "$wordToComplete*" }保证只提示以当前输入内容开头的选项,符合PowerShell默认的补全行为。
效果验证
- 输入
.\example.exe后按TAB,会提示foo、bar; - 输入
.\example.exe foo后按TAB,会提示foo_sub1、foo_sub2; - 输入
.\example.exe bar后按TAB,会提示bar_sub1、bar_sub2; - 不会再出现已输入参数的重复提示。
内容的提问来源于stack exchange,提问作者Flabala
相关产品推荐
相关产品推荐

