Powershell:将 xml 更改保存在新的 xml 变量或对象中,保持原始对象不变

2023-12-15

我有一个从中获取的 xml 变量Invoke-restmethod。我们称之为$object1

我想创建一个新变量或对象$object2那是一样的$object1但对值进行了一些更改

这是我尝试过的:

$object2 = $object1

$object2.sweets.candy.Where({$_.lemondrop -gt 1}) | Foreach{$_.gumdrop = 20}

现在的问题是当我仔细检查时$object1那里的值也改变了......我不想要那个

我只是希望改变继续存在$object2

我在这里做错了什么?


你需要clone $object1为了获得它的独立副本:

$object2 = $object1.Clone() # assumes that $object's type implements ICloneable

[System.Xml.XmlDocument] is a 参考类型(相对于值类型例如[int]), 意思就是:

$object2 = $object1

简单地使$object2引用(指向)与以下完全相同的对象$object1.

您可以按如下方式验证这一点:

[object]::ReferenceEquals($object1, $object2)

一般来说:

  • = with a 值类型实例创建一个的副本实际价值,即它隐式克隆。

  • = with a 参考类型实例创建一个的副本参考到实例,即,它创建对同一对象的另一个引用。

  • The 同样适用于当你添加元素到(可变的)收藏;例如(假设已经创建了一个列表$list = [System.Collections.Generic.List[object]] @()):

    • $var = 42; $list.Add($var) adds a copy of the 值类型 ([int]) 实例添加到列表中。
    • $var = [pscustomobject] @{ foo = 'bar' }; $list.Add($var) adds a 参考 to the 参考类型 ([pscustomobject]) 实例添加到列表中。

To 确定给定类型是值类型还是引用类型,使用类型的布尔值.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 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell:将 xml 更改保存在新的 xml 变量或对象中,保持原始对象不变 的相关文章

随机推荐