我正在尝试在 PowerShell 中编辑通过导入 JSON 文件创建的对象。然后我尝试使用点表示法来访问或修改对象的属性。
例如,下面是一个 JSON 示例和一个代码片段
{
"menus": {
"menu1": {
"position": "left"
}
}
}
# Import the file
$settings = Get-Content -Path somefile.json | ConvertFrom-Json
# Specify the property to change
$valueToChange = "menus.menu1.position"
$value = "left"
# Set the appropriate value according to the variables above
$settings.$valueToChange = $value
上面给了我:
异常设置“menus.menu1.position”:“在此对象上找不到属性“menus.menu1.position”。请验证该属性是否存在并且可以设置。”。”
然而,如果我在没有点符号中的变量的情况下执行完全相同的操作,则它会起作用。
# Import the file
$settings = Get-Content -Path somefile.json | ConvertFrom-Json
# Specify the property to change
$value = "left"
# Set the appropriate value according to the variables above but with a hard coded dot notation
$settings.menus.menu1.position = $value
我猜测它与字符串或类似变量有关,但问题是我需要以编程方式计算点符号以设置文件中的值,或者至少允许用户指定它。
我现在实际上已经解决了这个问题(只是完全避免这种方法),但我想看看这是否可行。
即使是点符号的干净替代品也会很高兴看到。我首先使用它的唯一原因是因为我真正的 JSON 对象非常复杂,而点符号非常简单且易于理解。
你想要做的事情在 PowerShell 中是不可能的,除非你使用Invoke-Expression
(这是强烈劝阻 https://blogs.msdn.microsoft.com/powershell/2011/06/03/invoke-expression-considered-harmful/).
您可以做的是使用递归函数,例如像这样:
function Set-Property($Json, $Path, $Value) {
$first, $rest = $Path
if ($rest) {
Set-Property -Json $Json.$first -Path $rest -Value $Value
} else {
$Json.$first = $Value
}
}
$valueToChange = 'menus.menu1.position'.Split('.')
$newValue = 'left'
Set-Property -Json $settings -Path $valueToChange -Value $newValue
请注意,这只是一个非常基本的草案,没有任何错误处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)