使用带有点符号的变量编辑/访问 Powershell 对象

2024-04-09

我正在尝试在 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(使用前将#替换为@)

使用带有点符号的变量编辑/访问 Powershell 对象 的相关文章

随机推荐