Powershell@函数自动补全@Register-ArgumentCompleter@查看自定义函数或第三方模块中函数的源代码

abstract

  • Powershell@函数自动补全@Register-ArgumentCompleter
  • 查看自定义函数或第三方模块中函数的源代码

Register-ArgumentCompleter

  • Register-ArgumentCompleter (Microsoft.PowerShell.Core) - PowerShell | Microsoft Learn

  • Register-ArgumentCompleter 是 PowerShell 中的一个内建命令,用于向 PowerShell 命令或函数参数注册自定义的补全脚本块,以便在用户交互式输入时提供智能提示和自动补全功能。

  • 这个命令使得 PowerShell 能够根据上下文给出相关选项的建议,从而提高工作效率并减少手动输入错误。

    以下是 Register-ArgumentCompleter 的基本语法:

    Register-ArgumentCompleter `
    -CommandName <String[]> `
    -ParameterName <String> `
    -ScriptBlock <ScriptBlock> `
    [-Native] `
    [-Description <String>] `
    [-Option <CompletionResultType>]
  • 各个参数解释如下:

    • -CommandName:指定要为其注册补全器的命令名或命令集。可以是一个字符串(单个命令)或字符串数组(多个命令)。

    • -ParameterName:指出要在哪个命令参数上启用补全功能。此参数接受一个字符串值,对应于目标命令中需要补全功能的参数名。

    • -ScriptBlock:这是一个包含实现补全逻辑的 PowerShell 脚本块。当用户按下 <TAB> 键触发补全时,PowerShell 将执行此脚本块,并期望返回一个字符串数组,这些字符串将成为补全选项。

      该脚本块通常接收以下参数:

      • $commandName
      • $parameterName
      • $wordToComplete:当前已输入但未完成的部分。
      • $commandAst:抽象语法树 (AST),用于解析命令行。
      • $fakeBoundParameters:一个哈希表,包含已绑定到命令的参数及其值。
    • -Native(可选):如果设置,则指示补全器用于原生命令而非 PowerShell 函数或别名。

    • -Description(可选):为补全器提供一个描述性字符串。

    • -Option(可选):允许指定 CompletionResultType 枚举成员,用来控制补全结果的样式,如是否加粗、是否带下划线等。

    在实践中,您通过构造一个恰当的 ScriptBlock,根据用户已输入的内容检索匹配项,然后将其作为补全建议返回。这样,当用户在命令行中尝试输入某个参数的值时,只需按下 <TAB> 键就能看到相应的候选选项。

补全命令名字

  • 为了创建一个在 PowerShell 中的自动补全功能,你可以使用动态参数和参数补全(TabExpansion)。这些特性可以帮助你在输入命令参数时提供自动补全的功能。
  • 下面是一个如何创建一个 Show-Command 函数,它使用了 Register-ArgumentCompleter 来注册一个自定义的参数补全器,使你能够在输入 -Name 参数时自动补全以指定字符串开头的命令

查看Powershell当前环境下某个自定义函数的源代码

function Get-CommandSourceCode
{
<#
.SYNOPSIS
查看Powershell当前环境下某个命令(通常是自定义的函数)的源代码
.DESCRIPTION
为例能够更方便地查看,在函数外面配置了本函数的Register-ArgumentCompleter 自动补全注册语句
这样在输入命令名后按Tab键,就能自动补全命令名,然后按Tab键再次,就能查看命令的源代码
.EXAMPLE
PS>Get-CommandSourceCode -Name prompt
if ($Env:CONDA_PROMPT_MODIFIER) {
$Env:CONDA_PROMPT_MODIFIER | Write-Host -NoNewline
}
CondaPromptBackup;
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$Name
)
Get-Command $Name | Select-Object -ExpandProperty ScriptBlock
}
# 注册参数补全,使其用于 Get-CommandSourceCode 的 Name 参数
Register-ArgumentCompleter -CommandName Get-CommandSourceCode -ParameterName Name -ScriptBlock {
param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
# 搜索所有可能的命令以便于补全
$commands = Get-Command -Name "$wordToComplete*" | ForEach-Object { $_.Name }
# 返回补全结果
$commands | ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
}
}
posted @   xuchaoxin1375  阅读(20)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2023-10-13 AM@闭区间上连续函数的性质定理@一致连续性
2022-10-13 批量删除某个类型的文件(windows端+linux端)(最佳实践)
2021-10-13 linux_用户管理/查看本机的用户/完整删除用户/创建新用户(交互命令adduser来创建新用户/用户切换su/sudo
点击右上角即可分享
微信分享提示