我正在寻找以下问题的更好解决方案。这段代码:
$a = "{value:'1'}" | ConvertFrom-Json
$b = $null
Write-Output ("a: {0} - b: {1}" -f $a, $b)
$b = $a
Write-Output ("a: {0} - b: {1}" -f $a, $b)
$a.value = '2'
Write-Output ("a: {0} - b: {1}" -f $a, $b)
$b.value = '3'
Write-Output ("a: {0} - b: {1}" -f $a, $b)
返回这个:
a: @{value=1} - b: a:@{value=1} - b:@{value=1} a:@{value=2} - b:@{value=2} a:@{value=3} - b:@{value=3}
我需要的是:设置$b
为之后,$a
我应该能够$a
在$b
保持不变的情况下进行更改。
我能想出的唯一解决方案是与 JSON 进行转换,如下所示:
$a = "{value:'1'}" | ConvertFrom-Json
$b = $null
Write-Output ("a: {0} - b: {1}" -f $a, $b)
$b = $a | ConvertTo-Json -depth 100 | ConvertFrom-Json
Write-Output ("a: {0} - b: {1}" -f $a, $b)
$a.value = '2'
Write-Output ("a: {0} - b: {1}" -f $a, $b)
$b.value = '3'
Write-Output ("a: {0} - b: {1}" -f $a, $b)
这将返回我想要的结果:
a: @{value=1} - b: a:@{value=1} - b:@{value=1} a: @{value=2} - b: @{value=1} a:@{value=2} - b:@{value=3}
我正在寻找更好的解决方案,因为在我的真实示例中,变量是从磁盘加载、更新并通过 PUT 保存到 API 的大型 JSON 文件。
更新:PSObject.Copy()
不能解决我的现实问题,因为 JSON 有嵌套对象(正如 Ansgar Wiechers 在他的回答中预测的那样)。
请参阅此示例了解 ConvertTo/From-Json 和 PSObject.Copy() 之间的行为差异:
$a = "{value:'1',nested:{foo:'original value'}}" | ConvertFrom-Json
$b = $a | ConvertTo-Json -depth 100 | ConvertFrom-Json
$a.nested.foo = 'changing $a does not change $b'
$b | ConvertTo-Json -Depth 1
$c = $a.PSObject.Copy()
$a.nested.foo = 'changing $a changes $c!'
$c | ConvertTo-Json -Depth 1
结果:
{
"value": "1",
"nested": {
"foo": "original value"
}
}
{
"value": "1",
"nested": {
"foo": "changing $a changes $c!"
}
}
更新2:我的问题被标记为重复的另一个问题中的代码在我的情况下确实有效(见下文),但我会坚持使用我的 ConvertTo/From-Json,因为它更简单......
$a = "{value:'1',nested:{foo:'original value'}}" | ConvertFrom-Json
$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $a)
$ms.Position = 0
$b = $bf.Deserialize($ms)
$ms.Close()
$a.nested.foo = 'changing $a does not change $b'
$b | ConvertTo-Json -Depth 1
结果:
{
"value": "1",
"nested": {
"foo": "original value"
}
}