首页 > 解决方案 > 将选项卡完成转发到另一个脚本

问题描述

我正在尝试使用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?
}

我尝试使用以下代码回调TabExpansion2from :(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.

有没有一种简单的方法可以将完成请求转发到子命令的脚本?

标签: powershellautocomplete

解决方案


推荐阅读