在 Powershell 中建立参数后使用 Tab Complete

Posted

技术标签:

【中文标题】在 Powershell 中建立参数后使用 Tab Complete【英文标题】:Using Tab Complete After an Established Parameter in Powershell 【发布时间】:2021-12-31 18:59:51 【问题描述】:

我发现一些代码允许您一次输出一个字符的文本,我正试图通过允许您选择前景色来使其更适合我的用例。我已经将前景色添加到我的参数中并且它响应正确,但是选项卡完成不会像 Write-Host 那样在颜色之间循环。

function get-easyview
    param(
    [int]$Milliseconds= 20,
    [string]$Foregroundcolor="RED")
    $text = $input | Out-String
   
    [char[]]$text | ForEach-Object
        Write-Host -nonewline -Foregroundcolor $Foregroundcolor $_
        # Only break for a non-whitespace character.
        if($_ -notmatch "\s")Sleep -Milliseconds $Milliseconds

    

 


$words="my salsa...  my salsa" | get-easyview

这会以红色输出文本,$words="my salsa... my salsa" | get-easyview -foregroundcolor green 会以绿色输出文本,但我希望选项卡在我键入 -foregroundcolor 后循环显示颜色。

有什么想法吗?

【问题讨论】:

【参考方案1】:

据我所知,您有 2 个选项来完成此任务。两者都允许您使用 Tab 键在集合中循环:

ValidateSet attribute:如果使用的参数不在集合中,这个会验证并抛出异常。
[ValidateSet('Red','White','Blue','Yellow')]
[string]$ForegroundColor = 'Red'
ArgumentCompletions attribute:这是从 PS 6+ 开始引入的,因此它与 Windows PowerShell 不兼容。正如 MS Docs 所述,区别在于:

但是,与ValidateSet 不同的是,这些值未经验证,更像是建议。因此,用户可以提供任何值,而不仅仅是列表中的值。

[ArgumentCompletions('Red','White','Blue','Yellow')]
[string]$ForegroundColor = 'Red'

示例


编辑

Register-ArgumentCompleter 添加到此答案中,因为它非常相关。

定义我们的函数:
function Test-ArgumentCompleter 
param(
    [string]$ForegroundColor
)
    $ForegroundColor

定义ScriptBlock,它将动态生成Tab自动补全:

您提供的脚本块应返回完成输入的值。脚本块必须使用管道(ForEach-ObjectWhere-Object 等)或其他合适的方法展开值。返回一个值数组会导致 PowerShell 将整个数组视为一个制表符完成值。

$scriptBlock = 
param(
    $commandName,
    $parameterName,
    $wordToComplete,
    $commandAst,
    $fakeBoundParameters
)

    'Red','White','Blue','Yellow' | Where-Object 
        $_ -like "$wordToComplete*"
     | ForEach-Object 
        $_
    

最后,注册 Argument Completer:
$params = @
    CommandName   = 'Test-ArgumentCompleter'
    ParameterName = 'ForegroundColor'
    ScriptBlock   = $scriptBlock

Register-ArgumentCompleter @params

【讨论】:

以上是关于在 Powershell 中建立参数后使用 Tab Complete的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PowerShell 中键入 TAB 字符?

Jenkins~powershell+cmd发布nuget包包

powershell基础介绍和运维场景

Win10(PowerShell)下Python命令行tab自动补全

SharePoint结合PowerShell建立入离职自动化

windows中cmd与powershell