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