Register-ArgumentCompleter

注册自定义参数完成程序。

语法

NativeSet

Register-ArgumentCompleter
    -CommandName <String[]>
    -ScriptBlock <ScriptBlock>
    [-Native]
    [<CommonParameters>]

PowerShellSet

Register-ArgumentCompleter
    -ParameterName <String>
    -ScriptBlock <ScriptBlock>
    [-CommandName <String[]>]
    [<CommonParameters>]

说明

Register-ArgumentCompleter cmdlet 注册自定义参数完成程序。 通过参数完成器,可以在运行时为指定的任何命令提供动态选项卡完成。

使用 CommandName 参数调用此命令时,如果没有 ParameterNameNative 参数,该命令将像指定 Native 参数一样运行。 这可以防止参数完成程序适用于 PowerShell 命令参数。 如果要为 PowerShell 命令注册参数完成程序,请始终指定 ParameterName 参数。

示例

示例 1:注册自定义参数完成程序

以下示例为 cmdlet 的 Set-TimeZone 参数注册参数完成程序。

$s = {
    param(
        $commandName,
        $parameterName,
        $wordToComplete,
        $commandAst,
        $fakeBoundParameters
    )

    (Get-TimeZone -ListAvailable).Id | Where-Object {
        $_ -like "$wordToComplete*"
    } | ForEach-Object {
        "'$_'"
    }
}

Register-ArgumentCompleter -CommandName Set-TimeZone -ParameterName Id -ScriptBlock $s

第一个命令创建一个脚本块,该块采用所需的参数,当用户按 tab 时传入这些参数。有关详细信息,请参阅 ScriptBlock 参数说明。

在脚本块中,使用 cmdlet 检索 Get-TimeZone 的可用值。 每个时区的 Id 属性通过管道传递给 Where-Object cmdlet。 Where-Object cmdlet 会筛选出任何不以 $wordToComplete提供的值开头的 ID,该 ID 表示用户在 按下 Tab之前键入的文本。筛选的 ID 通过管道传递给 ForEach-Object cmdlet,该 cmdlet 将每个值括在引号中,以处理包含空格的值。

第二个命令通过传递 scriptblock、ParameterNameIdCommandNameSet-TimeZone来注册参数完成程序。

示例 2:向选项卡完成值添加详细信息

以下示例覆盖 cmdlet 的 Stop-Service 参数的选项卡完成,并且仅返回正在运行的服务。

$s = {
    param(
        $commandName,
        $parameterName,
        $wordToComplete,
        $commandAst,
        $fakeBoundParameters
    )

    $services = Get-Service | Where-Object {
        $_.Status -eq 'Running' -and $_.Name -like "$wordToComplete*"
    }

    $services | ForEach-Object {
        New-Object -Type System.Management.Automation.CompletionResult -ArgumentList @(
            $_.Name          # completionText
            $_.Name          # listItemText
            'ParameterValue' # resultType
            $_.Name          # toolTip
        )
    }
}

Register-ArgumentCompleter -CommandName Stop-Service -ParameterName Name -ScriptBlock $s

第一个命令创建一个脚本块,该块采用所需的参数,当用户按 tab 时传入这些参数。有关详细信息,请参阅 ScriptBlock 参数说明。

在脚本块中,第一个命令使用 Where-Object cmdlet 检索所有正在运行的服务。 服务通过管道传递给 ForEach-Object cmdlet。 ForEach-Object cmdlet 创建新的 System.Management.Automation.CompletionResult 对象,并使用当前服务的名称填充它(由管道变量 $_.Name表示)。

CompletionResult 对象允许向每个返回的值提供其他详细信息:

  • completionText (字符串) - 要用作自动完成结果的文本。 这是发送到命令的值。
  • listItemText (String) - 列表中要显示的文本,例如当用户按下 Ctrl +空格时。 PowerShell 仅使用此功能进行显示。 选择后不会将它传递给命令。
  • resultTypeCompletionResultType) - 完成结果的类型。
  • 工具提示 (字符串) - 工具提示的文本,其中包含有关对象的详细信息。 当用户 在按 Ctrl+空格后选择项目时,这可见。

示例 3:注册自定义本机参数完成程序

可以使用 Native 参数为本机命令提供 Tab 补全。 以下示例为 dotnet 命令行接口 (CLI) 添加制表符补全。

注释

dotnet complete 命令仅在 2.0 版及更高版本的 dotnet cli 中可用。

$scriptblock = {
    param(
        $wordToComplete,
        $commandAst,
        $cursorPosition
    )

    dotnet complete --position $cursorPosition $commandAst.ToString() | ForEach-Object {
        [System.Management.Automation.CompletionResult]::new(
            $_,               # completionText
            $_,               # listItemText
            'ParameterValue', # resultType
            $_                # toolTip
        )
    }
}

Register-ArgumentCompleter -Native -CommandName dotnet -ScriptBlock $scriptblock

第一个命令创建一个脚本块,该块采用所需的参数,当用户按 tab 时传入这些参数。有关详细信息,请参阅 ScriptBlock 参数说明。

在脚本块中,dotnet complete 命令执行选项卡完成。 结果通过管道传递给 ForEach-Object cmdlet,该 cmdlet 使用 System.Management.Automation.CompletionResult 类的 静态方法为每个值创建 CompletionResult 对象。

参数

-CommandName

指定要为其注册参数完成器的一个或多个命令的名称。 对于本机命令,此参数是必需的。

在没有 ParameterNameNative 参数的情况下指定此参数时,命令的行为就像指定了 Native 参数一样。 为 PowerShell 命令注册参数完成程序时,请始终指定 ParameterName 参数。

如果未指定此参数,PowerShell 将在所有 PowerShell 命令中为指定的 ParameterName 注册参数完成程序。

参数属性

类型:

String[]

默认值:None
支持通配符:False
不显示:False

参数集

NativeSet
Position:Named
必需:True
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False
PowerShellSet
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Native

指示参数完成程序适用于 PowerShell 无法完成参数名称的本机命令。

参数属性

类型:SwitchParameter
默认值:None
支持通配符:False
不显示:False

参数集

NativeSet
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-ParameterName

指定参数完成程序适用的参数的名称。 指定参数的类型不能是枚举,例如 cmdlet 的 Write-Host 参数。

有关枚举的详细信息,请参阅 about_Enum

为 PowerShell 命令注册参数完成程序时,请始终指定此参数。 在没有 ParameterNameNative 参数的情况下指定 CommandName 参数时,命令的行为就像指定了 Native 参数一样。

参数属性

类型:String
默认值:None
支持通配符:False
不显示:False

参数集

PowerShellSet
Position:Named
必需:True
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-ScriptBlock

指定要运行的命令以执行选项卡完成。 提供的脚本块应返回完成输入的值。 脚本块必须使用管道(ForEach-ObjectWhere-Object等)或其他合适的方法取消注册值。 返回值数组会导致 PowerShell 将整个数组视为 一个 选项卡完成值。

脚本块还可以为每个值返回 System.Management.Automation.CompletionResult 对象,以增强用户体验。 返回 CompletionResult 对象后,用户可以定义当用户按 Ctrl Ctrl+Space 以显示可用完成列表时显示的工具提示和自定义列表条目。

脚本块必须接受以下参数,其顺序如下。 参数的名称并不重要,因为 PowerShell 按位置传入值。

  • $commandName(位置 0,字符串) - 此参数设置为脚本块提供选项卡完成的命令的名称。
  • $parameterName(位置 1,字符串) - 此参数设置为其值需要选项卡完成的参数。
  • $wordToComplete(位置 2,字符串) - 此参数设置为用户在按下 Tab Tab之前提供的值。脚本块应使用此值来确定选项卡完成值。
  • $commandAst(位置 3,CommandAst) - 此参数设置为当前输入行的抽象语法树(AST)。 有关详细信息,请参阅 CommandAst 类
  • $fakeBoundParameters(位置 4 IDictionary) - 此参数设置为包含 cmdlet $PSBoundParameters 的哈希表,然后用户按下 tab。有关详细信息,请参阅 about_Automatic_Variables

指定 Native 参数时,脚本块必须按指定顺序采用以下参数。 参数的名称并不重要,因为 PowerShell 按位置传入值。

  • $wordToComplete(位置 0,字符串) - 此参数设置为用户在按下 Tab Tab之前提供的值。脚本块应使用此值来确定选项卡完成值。
  • $commandAst(位置 1,CommandAst) - 此参数设置为当前输入行的抽象语法树(AST)。 有关详细信息,请参阅 CommandAst 类
  • $cursorPosition(位置 2,Int32) - 当用户 按下 Tab时,此参数将设置为光标的位置。

还可以提供 ArgumentCompleter 作为参数属性。 有关详细信息,请参阅 about_Functions_Advanced_Parameters

参数属性

类型:ScriptBlock
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:True
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

CommonParameters

此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters

输入

None

不能用管道将对象传送到此 cmdlet。

输出

None

此 cmdlet 不返回任何输出。