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

时间:2017-05-15 12:58:16

标签: powershell powershell-v4.0

鉴于这段代码

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

3 个答案:

答案 0 :(得分:2)

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

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

Invoke-Expression -Command "$string"

这将返回:

Value

所以你可以这样做:

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

将值设置为"其他"。

答案 1 :(得分: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

答案 2 :(得分:0)

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