powershell 在函数中,如何获取所有 * 赋值 *(非绑定)参数?

gk7wooem  于 2023-06-06  发布在  Shell
关注(0)|答案(1)|浏览(185)

我有一个带参数的函数。然后创建一个对象,并将这些参数值指定为对象的属性。如何以编程方式获取已分配的任何参数值(无论是通过默认值,还是在运行时绑定)?下面是我的代码:

function New-Label {
    param (
        [string] $text,
        [string] $name,
        [boolean] $autoSize = $true,
        [System.Drawing.Color] $foreColor = [System.Drawing.Color]::Black
    )
    $label = New-Object -TypeName System.Windows.Forms.Label
    $label.AutoSize = $autoSize
    $label.ForeColor = $foreColor
    foreach ($pair in $PSBoundParameters.GetEnumerator()){
        $label.$pair.Key = $pair.Value
    }
    return $label
}

对于运行时的用户绑定参数,$PSBoundParameters可以正常工作,但我不喜欢因为AutoSizeForeColor在运行时没有“绑定”而必须手动分配它们的属性。
更不用说,如果有大量的属性,它会变得乏味,简单地循环遍历它们会更有效。
是否有某种方法可以获得具有 assigned 值的任何参数(包括默认值-而不仅仅是 bound 参数)-这将是$autoSize$foreColor,加上$text和/或$name,无论哪个都是由用户分配的。

sycxhyv7

sycxhyv71#

在这种情况下,你绝对可以使用$PSBoundParameters,来检查哪些参数没有被绑定,并动态地将它们添加到$PSBoundParameters中,你可以使用以下命令:

Add-Type -AssemblyName System.Windows.Forms

function New-Label {
    [CmdletBinding()]
    param (
        [string] $text,
        [string] $name,
        [boolean] $autoSize = $true,
        [System.Drawing.Color] $foreColor = [System.Drawing.Color]::Black
    )

    # get all parameters of this command excluding common ones
    [System.Management.Automation.CommandMetadata]::new($MyInvocation.MyCommand).Parameters.GetEnumerator() |
        # filter them where they're not bound
        Where-Object { -not $PSBoundParameters.ContainsKey($_.Key) } |
        # add them to `$PSBoundParameters`
        ForEach-Object { $PSBoundParameters[$_.Key] = $PSCmdlet.SessionState.PSVariable.GetValue($_.Key) }

    # cast label from the hash
    [System.Windows.Forms.Label] $PSBoundParameters
}

# check if it works
New-Label -text foo -name bar |
    Select-Object text, name, autosize, forecolor

另外,请查看从哈希表创建对象

相关问题