2017-05-15 79 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

這是一個有趣的方法!我會嘗試一下。 (我也看到你對安全風險的觀點) –