You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell中获取已命名但未声明的函数参数?

实现捕获未声明命名参数的PowerShell函数

好问题!在PowerShell里确实有办法实现你想要的功能,但需要借助高级函数的特性——默认情况下,如果你的函数没有声明对应参数,直接传入-Name "John Doe"这类命名参数会触发错误,因为PowerShell找不到匹配的参数定义。下面是具体的实现方案:

核心思路:利用$PSCmdlet.UnboundArguments

当你给函数添加[CmdletBinding()]属性后,就可以通过$PSCmdlet自动变量访问到未绑定的参数集合。这个集合会包含所有未被函数声明的参数(包括命名参数的名称和对应值),我们只需要把它转换成键值对形式即可。

完整实现示例

function Get-Parameters {
    [CmdletBinding()]
    param()

    # 初始化哈希表存储解析后的参数
    $unboundParams = @{}
    $rawUnbound = $PSCmdlet.UnboundArguments

    # 遍历未绑定参数,将"-参数名 值"的结构转换成键值对
    for ($i = 0; $i -lt $rawUnbound.Count; $i += 2) {
        # 去掉参数名前的"-"符号
        $paramName = $rawUnbound[$i].TrimStart('-')
        $unboundParams[$paramName] = $rawUnbound[$i + 1]
    }

    # 输出解析后的参数
    $unboundParams
}

# 测试调用
Get-Parameters -Name "John Doe" -Age 30 -City "New York"

运行效果

执行上面的测试命令后,会返回一个包含所有未声明参数的哈希表:

Name                           Value
----                           -----
Name                           John Doe
Age                            30
City                           New York

补充说明

  • 为什么需要[CmdletBinding()]?这个属性会把普通函数升级为高级函数,让你能访问$PSCmdlet这类高级自动变量,同时支持PowerShell的通用参数(比如-Verbose、-Debug)。
  • 如果不想手动解析键值对,也可以直接输出$PSCmdlet.UnboundArguments,它会以原始列表形式返回(比如-Name, John Doe, -Age, 30),适合简单场景。
  • 注意:这种方式既能捕获命名参数,也会包含剩余的位置参数,如果混合使用位置参数,需要额外处理逻辑区分。

内容的提问来源于stack exchange,提问作者LaboratoryGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:09:53