2017-05-15 45 views
0

鉴于这段代码访问与点符号的pscustomobject在一个字符串

$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 

我ü ltimate的目标是去改变与

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

内容显然$子串方法是行不通的,也不是我试过的其他方法。

+0

对我来说,它不知道你要才达到的。我可以用多种方式来想象多种结果。 – restless1987

回答

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

这是一个有趣的方法!我会尝试一下。 (我也看到你对安全风险的观点) –