在字符串中使用点符号访问 pscustomobject
Accessing an pscustomobject with dot notation in a string
给出这段代码
$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 方法不起作用,我尝试过的其他方法也不起作用。
您可以使用 Invoke-expression 来处理这个问题,因为它会像解析命令一样解析传递给它的字符串。
因此您可以执行以下操作:
Invoke-Expression -Command "$string"
这将 return:
Value
所以你可以这样做:
Invoke-Expression -Command "$String = `"Something else`""
这会将值设置为 "Something else"。
Invoke-Expression
在其他语言中并不比 eval
好。它很可能会做某事 undesired/unexpected 因为它将给定的字符串评估为代码。我不建议走那条路,除非你确切地知道你在做什么。
尝试使用递归函数:
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
您也可以考虑使用专用函数来完成这项工作,而不是依赖于 Invoke-Expression
。 中详细介绍了此类解决方案。
给出这段代码
$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 方法不起作用,我尝试过的其他方法也不起作用。
您可以使用 Invoke-expression 来处理这个问题,因为它会像解析命令一样解析传递给它的字符串。
因此您可以执行以下操作:
Invoke-Expression -Command "$string"
这将 return:
Value
所以你可以这样做:
Invoke-Expression -Command "$String = `"Something else`""
这会将值设置为 "Something else"。
Invoke-Expression
在其他语言中并不比 eval
好。它很可能会做某事 undesired/unexpected 因为它将给定的字符串评估为代码。我不建议走那条路,除非你确切地知道你在做什么。
尝试使用递归函数:
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
您也可以考虑使用专用函数来完成这项工作,而不是依赖于 Invoke-Expression
。