在 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-Object
、Where-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的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins~powershell+cmd发布nuget包包
Win10(PowerShell)下Python命令行tab自动补全