首页 > 解决方案 > 如何将对象的点属性作为变量传递?

问题描述

我是 StackOverflow 的新手,但对 PowerShell 来说并不是那么新……我正在编写一个函数,该函数使用该$host.UI.PromptForChoice()方法向用户显示选项列表。它需要一个对象数组,读取一个用作标签的属性,然后在屏幕上显示选项。当用作标签的属性是一个简单的字符串时,该函数可以正常工作。当标签所需的属性是两个(或更多)级别时,它不起作用。

例如:

$object[i].base变为$object[i].$var($var = "base") <- 这有效!

$object[i].base.name变为$object[i].$var($var = "base.name") <- 这不返回任何内容。

我尝试了不同的方式来使用变量而没有改变。 $object.{$var} $object.($var) $object."$var"

我几乎可以肯定这是“。”的问题。在变量中被解释。都是一串。

这是完整的功能。我从 Internet 上的另一个帖子中借用了此代码的基础知识,但现在我再也找不到那个帖子了。我向作者道歉,因为他们没有正确地相信他们!

function Show-UserChoices {
        param (
        [Parameter(Mandatory=$true)]
        $InputObject,
        [Parameter(Mandatory=$true)]
        [string]$LabelProperty,
        [string]$Caption = "Please make a selection",
        [string]$Message = "Type or copy/paste the text of your choice",
        [int]$DefaultChoice = -1
    )
    $choices = @()
    for($i=0;$i -lt $InputObject.Count;$i++){
        $choices += [System.Management.Automation.Host.ChoiceDescription]("$($InputObject[$i].$LabelProperty)")
    }
    $userChoice = $host.UI.PromptForChoice($Caption,$Message,$choices,$DefaultChoice)
    return $userChoice
}

任何关于我在这里缺少的建议都非常感谢!

更新:

我找到了处理属性的解决方案。如果我将每个属性标签作为数组中的索引传递,我可以在函数中组装表达式并运行它。它可能不是最漂亮的代码,但它可以满足我的需要。这是我所做的更改:

 .example
    Show-UserChoices -InputObject $object -LabelProperty foo,bar
    This will construct the expression $object.foo.bar

 [string[]]$LabelProperty, <-- now accepts an array of strings


$choices = @()
    for($i=0;$i -lt $InputObject.Count;$i++){
        $exp = '$InputObject[$i]'
        foreach ($j in $LabelProperty){
            $exp += '.' + $j
        }
        $choices += [System.Management.Automation.Host.ChoiceDescription]("$(Invoke-Expression $exp)")
    }

标签: powershellpowershell-5.0

解决方案


推荐阅读