json 为什么我的powershell代码在作为模块从另一个文件调用时行为不同?

klsxnrf1  于 2023-05-30  发布在  Shell
关注(0)|答案(1)|浏览(126)

我写了一个powershell函数来自动合并.json文件。很简单总结如下:
1.它有三条路径。第一个用于旧文件,第二个用于新文件,第三个用于目标。
1.它将迭代新文件的json树的所有叶子,并为每个叶子生成一个包含唯一地址的列表。
1.它将遍历地址列表并:如果该地址存在于新的和旧的json中,则新的json中的该地址的值将与旧的json相同。如果该值存在于新的json中,而不存在于旧的json中,则地址和值将保留在新的json中。如果该地址存在于旧的json中,而不存在于新的json中,则它将继续不存在于新的json中。
1.生成的新json将保存在目标路径中。
我写这段代码是作为一个项目的一部分,在这个项目中,我正在为一些文件类型(如.ini和. xml)编写这种简单的自动合并。我将所有的合并函数都编写为powershell模块(.psm1),然后从一个.ps1文件调用它们,该文件构成了用户和合并脚本之间的接口。
我遇到的问题如下。当我将json合并作为.ps1文件进行测试时,它完美无瑕。将其作为.ps1运行的示例:
JsonMerge.ps1

function MergeJsonFiles($oldCfgPath, $newCfgPath, $targetCfgPath) {
    # CODE
    $json | Out-File -FilePath "$targetCfgPath"
}

MergeJsonFiles './oldtest.json' './newtest.json' './targettest.json'

oldtest.json

{
  "A": {
    "B": [
      {
        "ABC": 1,
        "DEF": 2
      },
      {
        "A$C": "AB$CE",
        "ASDC": "ASDHJ"
      }
    ]
  },
  "D": "Deprecated Value"
}

newtest.json

{
  "A": {
    "B" : [
      {
        "ABC": 0,
        "DEF": 0
      },
      {
        "A$C": "A",
        "ASDC": "A"
      }
    ]
  },
  "N": "New Value"
}

结果:targettest.json

{
  "A": {
    "B": [
      {
        "ABC": 1,
        "DEF": 2
      },
      {
        "A$C": "AB$CE",
        "ASDC": "ASDHJ"
      }
    ]
  },
  "N": "New Value"
}

但这是当我调用相同的函数时发生的事情,使用相同的参数,但将其导入为模块:新旧测试文件是相同的,但这是结果目标JSON

{
  "A": {
    "B": [
      {
        "ABC": "1$",
        "DEF": "2$"
      },
      {
        "A$C": "A",
        "ASDC": "ASDHJ$",
        "A": "AB$"
      }
    ]
  },
  "N": "New Value"
}

为什么会这样呢?为什么每个值的末尾都有一个“$”?为什么数值变成了以“$”结尾的字符串?我只是不明白。所有代码都在github上。请帮帮我

eit6fx6z

eit6fx6z1#

事实证明,问题是WSL和Windows中的不同PowerShell环境。我删除了我之前的回答,因为@mklement0指出,一旦你深入研究,我推荐的两个解决方案都没有那么大的意义。无法删除此答案,因为它已标记为接受。

相关问题