鉴于这段代码
$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方法不起作用,也没有其他方法我尝试过。
答案 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-Expression
。 this tread中详细介绍了此类解决方案。