在字符串中使用点表示法访问pscustomobject

问题描述 投票:0回答:3

鉴于这段代码

$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方法不起作用,也没有我试过的其他方法。

powershell powershell-v4.0
3个回答
2
投票

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

所以你可以做到以下几点:

Invoke-Expression -Command "$string"

这将返回:

Value

所以你可以这样做:

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

将值设置为“其他”。


1
投票

在其他语言中,Invoke-Expression并不比eval好。它很可能做一些不受欢迎/意外的事情,因为它将给定的字符串作为代码进行评估。除非你确切知道你在做什么,否则我不建议你去那条路。

尝试使用递归函数:

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

0
投票

您也可以考虑使用专用函数来完成这项工作,而不是依赖于Invoke-Expression。像这样的解决方案在this tread中有详细说明。

© www.soinside.com 2019 - 2024. All rights reserved.