在字符串中使用点符号访问 pscustomobject

Accessing an pscustomobject with dot notation in a string

给出这段代码

$Object = @"
{
    "Item1":{
        "Subitem1":{
            "Subsubvalue":"Value"
        }
    },
    "Value1":"value1"
}

"@ | ConvertFrom-Json 

并给出以下字符串(我在运行时不知道,我刚得到一个带有对象路径的字符串)

$String = "$Object.Item1.Subitem1.Subsubvalue"

我正在尝试执行以下操作 - 但我找不到让它工作的方法

PS C:\> $Substring = $string.substring(8)
PS C:\> $Object.$Substring 
Value 

我的最终目标是修改那个

的内容
PS C:\> $Object.$Substring = "something else" 

显然 $substring 方法不起作用,我尝试过的其他方法也不起作用。

您可以使用 Invoke-expression 来处理这个问题,因为它会像解析命令一样解析传递给它的字符串。

因此您可以执行以下操作:

Invoke-Expression -Command "$string"

这将 return:

Value

所以你可以这样做:

Invoke-Expression -Command "$String = `"Something else`""

这会将值设置为 "Something else"。

Invoke-Expression 在其他语言中并不比 eval 好。它很可能会做某事 undesired/unexpected 因为它将给定的字符串评估为代码。我不建议走那条路,除非你确切地知道你在做什么。

尝试使用递归函数:

function Get-NestedItem {
    Param(
        [Parameter(Mandatory=$true, Position=0)]
        $InputObject,

        [Parameter(Mandatory=$false, Position=1)]
        [AllowEmptyString()]
        [string]$Path = '',

        [Parameter(Mandatory=$false, Position=2)]
        [string]$Delimiter = '.'
    )

    if ($Path) {
        $child, $rest = $Path.Split($Delimiter, 2)
        Get-NestedItem $InputObject.$child $rest
    } else {
        $InputObject
    }
}

$Object = ...
$Path   = 'Item1.Subitem1.Subsubvalue'

Get-NestedItem $Object $Path

您也可以考虑使用专用函数来完成这项工作,而不是依赖于 Invoke-Expression 中详细介绍了此类解决方案。