Powershell:在新的xml变量或对象中保存xml变化,保持原始对象不变
Powershell: saving xml changes in a new xml variable or object, keeping the original object unchanged
我有一个从 Invoke-restmethod
获得的 xml 变量。让我们称之为 $object1
我想创建一个新的变量或对象 $object2
,它与 $object1
相同,但对值进行了一些更改
这是我尝试过的:
$object2 = $object1
$object2.sweets.candy.Where({$_.lemondrop -gt 1}) | Foreach{$_.gumdrop = 20}
现在的问题是当我仔细检查 $object1
那里的值也改变了...我不想要那个
我只想让 chage 留在 $object2
我在这里做错了什么?
您需要克隆 $object1
以获得它的独立副本:
$object2 = $object1.Clone() # assumes that $object's type implements ICloneable
[System.Xml.XmlDocument]
是一个reference type (as opposed to a value type比如[int]
),意思是:
$object2 = $object1
只是让 $object2
引用(指向)与 $object1
.
完全相同的对象
您可以通过以下方式验证:
[object]::ReferenceEquals($object1, $object2)
一般:
=
具有 值类型 实例创建一个 副本实际值,即隐式克隆。
=
具有 引用类型 实例创建一个 副本对实例的引用,即,它创建了对同一对象的另一个引用。
当您将元素添加到(可变)集合[=时,同样适用74=];例如(假设已经用 $list = [System.Collections.Generic.List[object]] @()
创建了一个列表):
$var = 42; $list.Add($var)
将 value-type ([int]
) 实例的 copy 添加到列表中。
$var = [pscustomobject] @{ foo = 'bar' }; $list.Add($var)
将 reference 添加到列表的 reference-type ([pscustomobject]
) 实例。
要确定给定类型是值类型还是引用类型,请使用类型的布尔值 .IsValueType
属性:
# Inspect a type directly.
PS> [System.Xml.XmlDocument].IsValueType
False # -> a *reference* type
# Inspect a type via an instance thereof:
PS> $xml = [xml] '<xml/>'; $xml.GetType().IsValueType
False
我有一个从 Invoke-restmethod
获得的 xml 变量。让我们称之为 $object1
我想创建一个新的变量或对象 $object2
,它与 $object1
相同,但对值进行了一些更改
这是我尝试过的:
$object2 = $object1
$object2.sweets.candy.Where({$_.lemondrop -gt 1}) | Foreach{$_.gumdrop = 20}
现在的问题是当我仔细检查 $object1
那里的值也改变了...我不想要那个
我只想让 chage 留在 $object2
我在这里做错了什么?
您需要克隆 $object1
以获得它的独立副本:
$object2 = $object1.Clone() # assumes that $object's type implements ICloneable
[System.Xml.XmlDocument]
是一个reference type (as opposed to a value type比如[int]
),意思是:
$object2 = $object1
只是让 $object2
引用(指向)与 $object1
.
您可以通过以下方式验证:
[object]::ReferenceEquals($object1, $object2)
一般:
=
具有 值类型 实例创建一个 副本实际值,即隐式克隆。=
具有 引用类型 实例创建一个 副本对实例的引用,即,它创建了对同一对象的另一个引用。当您将元素添加到(可变)集合[=时,同样适用74=];例如(假设已经用
$list = [System.Collections.Generic.List[object]] @()
创建了一个列表):$var = 42; $list.Add($var)
将 value-type ([int]
) 实例的 copy 添加到列表中。$var = [pscustomobject] @{ foo = 'bar' }; $list.Add($var)
将 reference 添加到列表的 reference-type ([pscustomobject]
) 实例。
要确定给定类型是值类型还是引用类型,请使用类型的布尔值 .IsValueType
属性:
# Inspect a type directly.
PS> [System.Xml.XmlDocument].IsValueType
False # -> a *reference* type
# Inspect a type via an instance thereof:
PS> $xml = [xml] '<xml/>'; $xml.GetType().IsValueType
False