我写了一个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上。请帮帮我
1条答案
按热度按时间eit6fx6z1#
事实证明,问题是WSL和Windows中的不同PowerShell环境。我删除了我之前的回答,因为@mklement0指出,一旦你深入研究,我推荐的两个解决方案都没有那么大的意义。无法删除此答案,因为它已标记为接受。