powershell - 将选项卡完成转发到另一个脚本
问题描述
我正在尝试使用Register-ArgumentCompleter
以下行为来实现子命令完成:
> mycommand <tab>
subcommandA subcommandB subcommandC
> mycommand subcommandA <tab>
optionA1 optionA2
> mycommand subcommandB <tab>
optionB1 optionB2
我还想将每个子命令拆分为commands/
目录中自己的脚本并动态发现它们。我已经使用以下代码实现了呼叫转移和顶级完成:
Function mycommand {
[CmdletBinding()]
Param(
[parameter(Mandatory = $true)]
[String] $command,
[parameter(ValueFromRemainingArguments = $true)]
[String[]]$arguments
)
# Forward all arguments
& "$PSScriptRoot\commands\$command.ps1" @arguments
}
Register-ArgumentCompleter -CommandName mycommand -ParameterName command -ScriptBlock {
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
return @(Get-ChildItem "$PSScriptRoot\commands" | %{ $_.Basename } | Sort -Unique)
}
Register-ArgumentCompleter -CommandName nrm -ParameterName arguments -ScriptBlock {
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
# (1) I land here with the correct `$fakeBoundParameters.command`. Now what?
}
我尝试使用以下代码回调TabExpansion2
from :(1)
# Remove mycommand and subcommandX, replace with subcommandX's script path
$command = $fakeBoundParameters.command
$subtokens = $($commandAst.CommandElements | Select-Object -Skip 2)
$inputScript = "`"$PSScriptRoot\commands\$command.ps1`" $subtokens "
$(TabExpansion2 -inputScript $inputScript -cursorColumn $inputScript.Length -options $null).CompletionMatches
...但CompletionMatches
空空如也。我也不确定是否传递光标位置,我无法从我的ArgumentCompleter
.
有没有一种简单的方法可以将完成请求转发到子命令的脚本?
解决方案
推荐阅读
- c# - 为For循环内对象数组的属性赋值
- java - 有没有办法为同一平台上的多个目标的 java 应用程序构建安装程序?
- c - 为什么 fgets 和 gets 无法将字符串读入结构?
- python - Python 中的依赖类型和多态性与 mypy
- php - symfony 4 学说 createQueryBuilder with andWhere
- jquery - 如何在 CSS 动画中设置可见性:隐藏然后可见性:可见?
- javascript - 如何在 JavaScript 中修复数组
- c - C中两个矩阵的和和乘积(带函数)
- facebook-graph-api - 从 Facebook Graph API 中提取我的时间线帖子
- mysql - 需要一些关于外键约束的解释